Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
52f82a11
Commit
52f82a11
authored
Feb 01, 2012
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc: add avcodec_encode_video2() that encodes from an AVFrame -> AVPacket
Deprecate avcodec_encode_video().
parent
21d0d1d6
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
137 additions
and
8 deletions
+137
-8
APIchanges
doc/APIchanges
+3
-0
avcodec.h
libavcodec/avcodec.h
+39
-0
utils.c
libavcodec/utils.c
+92
-8
version.h
libavcodec/version.h
+3
-0
No files found.
doc/APIchanges
View file @
52f82a11
...
...
@@ -13,6 +13,9 @@ libavutil: 2011-04-18
API changes, most recent first:
2012-02-01 - xxxxxxx - lavc 54.01.0
Add avcodec_encode_video2() and deprecate avcodec_encode_video().
2012-02-01 - 316fc74 - lavc 54.01.0
Add av_fast_padded_malloc() as alternative for av_realloc() when aligned
memory is required. The buffer will always have FF_INPUT_BUFFER_PADDING_SIZE
...
...
libavcodec/avcodec.h
View file @
52f82a11
...
...
@@ -3770,7 +3770,10 @@ int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
enum
AVSampleFormat
sample_fmt
,
const
uint8_t
*
buf
,
int
buf_size
,
int
align
);
#if FF_API_OLD_ENCODE_VIDEO
/**
* @deprecated use avcodec_encode_video2() instead.
*
* Encode a video frame from pict into buf.
* The input picture should be
* stored using a specific format, namely avctx.pix_fmt.
...
...
@@ -3782,8 +3785,44 @@ int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
* @return On error a negative value is returned, on success zero or the number
* of bytes used from the output buffer.
*/
attribute_deprecated
int
avcodec_encode_video
(
AVCodecContext
*
avctx
,
uint8_t
*
buf
,
int
buf_size
,
const
AVFrame
*
pict
);
#endif
/**
* Encode a frame of video.
*
* Takes input raw video data from frame and writes the next output packet, if
* available, to avpkt. The output packet does not necessarily contain data for
* the most recent frame, as encoders can delay and reorder input frames
* internally as needed.
*
* @param avctx codec context
* @param avpkt output AVPacket.
* The user can supply an output buffer by setting
* avpkt->data and avpkt->size prior to calling the
* function, but if the size of the user-provided data is not
* large enough, encoding will fail. All other AVPacket fields
* will be reset by the encoder using av_init_packet(). If
* avpkt->data is NULL, the encoder will allocate it.
* The encoder will set avpkt->size to the size of the
* output packet. The returned data (if any) belongs to the
* caller, he is responsible for freeing it.
* @param[in] frame AVFrame containing the raw video data to be encoded.
* May be NULL when flushing an encoder that has the
* CODEC_CAP_DELAY capability set.
* @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
* output packet is non-empty, and to 0 if it is
* empty. If the function returns an error, the
* packet can be assumed to be invalid, and the
* value of got_packet_ptr is undefined and should
* not be used.
* @return 0 on success, negative error code on failure
*/
int
avcodec_encode_video2
(
AVCodecContext
*
avctx
,
AVPacket
*
avpkt
,
const
AVFrame
*
frame
,
int
*
got_packet_ptr
);
int
avcodec_encode_subtitle
(
AVCodecContext
*
avctx
,
uint8_t
*
buf
,
int
buf_size
,
const
AVSubtitle
*
sub
);
...
...
libavcodec/utils.c
View file @
52f82a11
...
...
@@ -1034,23 +1034,107 @@ int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx,
}
#endif
#if FF_API_OLD_ENCODE_VIDEO
int
attribute_align_arg
avcodec_encode_video
(
AVCodecContext
*
avctx
,
uint8_t
*
buf
,
int
buf_size
,
const
AVFrame
*
pict
)
{
AVPacket
pkt
;
int
ret
,
got_packet
=
0
;
if
(
buf_size
<
FF_MIN_BUFFER_SIZE
){
av_log
(
avctx
,
AV_LOG_ERROR
,
"buffer smaller than minimum size
\n
"
);
return
-
1
;
}
if
(
av_image_check_size
(
avctx
->
width
,
avctx
->
height
,
0
,
avctx
))
return
-
1
;
if
((
avctx
->
codec
->
capabilities
&
CODEC_CAP_DELAY
)
||
pict
){
int
ret
=
avctx
->
codec
->
encode
(
avctx
,
buf
,
buf_size
,
pict
);
avctx
->
frame_number
++
;
emms_c
();
//needed to avoid an emms_c() call before every return;
return
ret
;
}
else
av_init_packet
(
&
pkt
);
pkt
.
data
=
buf
;
pkt
.
size
=
buf_size
;
ret
=
avcodec_encode_video2
(
avctx
,
&
pkt
,
pict
,
&
got_packet
);
if
(
!
ret
&&
got_packet
&&
avctx
->
coded_frame
)
{
avctx
->
coded_frame
->
pts
=
pkt
.
pts
;
avctx
->
coded_frame
->
key_frame
=
!!
(
pkt
.
flags
&
AV_PKT_FLAG_KEY
);
}
/* free any side data since we cannot return it */
if
(
pkt
.
side_data_elems
>
0
)
{
int
i
;
for
(
i
=
0
;
i
<
pkt
.
side_data_elems
;
i
++
)
av_free
(
pkt
.
side_data
[
i
].
data
);
av_freep
(
&
pkt
.
side_data
);
pkt
.
side_data_elems
=
0
;
}
return
ret
?
ret
:
pkt
.
size
;
}
#endif
#define MAX_CODED_FRAME_SIZE(width, height)\
(8*(width)*(height) + FF_MIN_BUFFER_SIZE)
int
attribute_align_arg
avcodec_encode_video2
(
AVCodecContext
*
avctx
,
AVPacket
*
avpkt
,
const
AVFrame
*
frame
,
int
*
got_packet_ptr
)
{
int
ret
;
int
user_packet
=
!!
avpkt
->
data
;
if
(
!
(
avctx
->
codec
->
capabilities
&
CODEC_CAP_DELAY
)
&&
!
frame
)
{
av_init_packet
(
avpkt
);
avpkt
->
size
=
0
;
*
got_packet_ptr
=
0
;
return
0
;
}
if
(
av_image_check_size
(
avctx
->
width
,
avctx
->
height
,
0
,
avctx
))
return
AVERROR
(
EINVAL
);
if
(
avctx
->
codec
->
encode2
)
{
*
got_packet_ptr
=
0
;
ret
=
avctx
->
codec
->
encode2
(
avctx
,
avpkt
,
frame
,
got_packet_ptr
);
if
(
!
ret
)
{
if
(
!*
got_packet_ptr
)
avpkt
->
size
=
0
;
else
if
(
!
(
avctx
->
codec
->
capabilities
&
CODEC_CAP_DELAY
))
avpkt
->
pts
=
avpkt
->
dts
=
frame
->
pts
;
}
}
else
{
/* for compatibility with encoders not supporting encode2(), we need to
allocate a packet buffer if the user has not provided one or check
the size otherwise */
int
buf_size
=
avpkt
->
size
;
if
(
!
user_packet
)
buf_size
=
MAX_CODED_FRAME_SIZE
(
avctx
->
width
,
avctx
->
height
);
if
((
ret
=
ff_alloc_packet
(
avpkt
,
buf_size
)))
return
ret
;
/* encode the frame */
ret
=
avctx
->
codec
->
encode
(
avctx
,
avpkt
->
data
,
avpkt
->
size
,
frame
);
if
(
ret
>=
0
)
{
if
(
!
ret
)
{
/* no output. if the packet data was allocated by libavcodec,
free it */
if
(
!
user_packet
)
av_freep
(
&
avpkt
->
data
);
}
else
if
(
avctx
->
coded_frame
)
{
avpkt
->
pts
=
avctx
->
coded_frame
->
pts
;
avpkt
->
flags
|=
AV_PKT_FLAG_KEY
*
avctx
->
coded_frame
->
key_frame
;
}
avpkt
->
size
=
ret
;
*
got_packet_ptr
=
(
ret
>
0
);
ret
=
0
;
}
}
if
(
!
ret
)
avctx
->
frame_number
++
;
emms_c
();
return
ret
;
}
int
avcodec_encode_subtitle
(
AVCodecContext
*
avctx
,
uint8_t
*
buf
,
int
buf_size
,
...
...
libavcodec/version.h
View file @
52f82a11
...
...
@@ -47,5 +47,8 @@
#ifndef FF_API_OLD_ENCODE_AUDIO
#define FF_API_OLD_ENCODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 55)
#endif
#ifndef FF_API_OLD_ENCODE_VIDEO
#define FF_API_OLD_ENCODE_VIDEO (LIBAVCODEC_VERSION_MAJOR < 55)
#endif
#endif
/* AVCODEC_VERSION_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment