Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
avcodec: Make all ff_alloc_packet() based encoders accept user buffers
Up until now, these encoders received non-refcounted packets (whose data
was owned by the corresponding AVCodecContext) from ff_alloc_packet();
these packets were made refcounted lateron by
av_packet_make_refcounted() generically.
This commit makes these encoders accept user-supplied buffers by
replacing av_packet_make_refcounted() with an equivalent function
that is based upon get_encode_buffer().

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
  • Loading branch information
mkver committed May 12, 2021
1 parent 73bbbf8 commit 4c06a1e
Show file tree
Hide file tree
Showing 50 changed files with 88 additions and 29 deletions.
3 changes: 2 additions & 1 deletion libavcodec/aacenc.c
Expand Up @@ -1136,14 +1136,15 @@ const AVCodec ff_aac_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_AAC,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_SMALL_LAST_FRAME,
.priv_data_size = sizeof(AACEncContext),
.init = aac_encode_init,
.encode2 = aac_encode_frame,
.close = aac_encode_end,
.defaults = aac_encode_defaults,
.supported_samplerates = mpeg4audio_sample_rates,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE },
.priv_class = &aacenc_class,
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/alacenc.c
Expand Up @@ -637,12 +637,12 @@ const AVCodec ff_alac_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_ALAC,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SMALL_LAST_FRAME,
.priv_data_size = sizeof(AlacEncodeContext),
.priv_class = &alacenc_class,
.init = alac_encode_init,
.encode2 = alac_encode_frame,
.close = alac_encode_close,
.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME,
.channel_layouts = ff_alac_channel_layouts,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S32P,
AV_SAMPLE_FMT_S16P,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/aliaspixenc.c
Expand Up @@ -107,6 +107,7 @@ const AVCodec ff_alias_pix_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Alias/Wavefront PIX image"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_ALIAS_PIX,
.capabilities = AV_CODEC_CAP_DR1,
.encode2 = encode_frame,
.pix_fmts = (const enum AVPixelFormat[]) {
AV_PIX_FMT_BGR24, AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE
Expand Down
2 changes: 2 additions & 0 deletions libavcodec/asvenc.c
Expand Up @@ -347,6 +347,7 @@ const AVCodec ff_asv1_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("ASUS V1"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_ASV1,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(ASV1Context),
.init = encode_init,
.encode2 = encode_frame,
Expand All @@ -362,6 +363,7 @@ const AVCodec ff_asv2_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("ASUS V2"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_ASV2,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(ASV1Context),
.init = encode_init,
.encode2 = encode_frame,
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/cfhdenc.c
Expand Up @@ -851,12 +851,12 @@ const AVCodec ff_cfhd_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("GoPro CineForm HD"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_CFHD,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
.priv_data_size = sizeof(CFHDEncContext),
.priv_class = &cfhd_class,
.init = cfhd_encode_init,
.close = cfhd_encode_close,
.encode2 = cfhd_encode_frame,
.capabilities = AV_CODEC_CAP_FRAME_THREADS,
.pix_fmts = (const enum AVPixelFormat[]) {
AV_PIX_FMT_YUV422P10,
AV_PIX_FMT_GBRP12,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/cinepakenc.c
Expand Up @@ -1184,6 +1184,7 @@ const AVCodec ff_cinepak_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Cinepak"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_CINEPAK,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(CinepakEncContext),
.init = cinepak_encode_init,
.encode2 = cinepak_encode_frame,
Expand Down
19 changes: 18 additions & 1 deletion libavcodec/encode.c
Expand Up @@ -105,6 +105,23 @@ int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, i
return ret;
}

int ff_encode_make_refcounted(AVCodecContext *avctx, AVPacket *avpkt)
{
uint8_t *data = avpkt->data;
int ret;

if (avpkt->buf)
return 0;

avpkt->data = NULL;
ret = ff_get_encode_buffer(avctx, avpkt, avpkt->size, 0);
if (ret < 0)
return ret;
memcpy(avpkt->data, data, avpkt->size);

return 0;
}

/**
* Pad last frame with silence.
*/
Expand Down Expand Up @@ -219,7 +236,7 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt)

if (!ret && got_packet) {
if (avpkt->data) {
ret = av_packet_make_refcounted(avpkt);
ret = ff_encode_make_refcounted(avctx, avpkt);
if (ret < 0)
goto end;
}
Expand Down
6 changes: 6 additions & 0 deletions libavcodec/encode.h
Expand Up @@ -44,6 +44,12 @@ int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame);
*/
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags);

/**
* Equivalent of av_packet_make_refcounted(), but uses the AVCodecContext's
* get_encode_buffer() callback to allocate the buffer.
*/
int ff_encode_make_refcounted(AVCodecContext *avctx, AVPacket *avpkt);

/**
* Check AVPacket size and allocate data.
*
Expand Down
3 changes: 2 additions & 1 deletion libavcodec/ffv1enc.c
Expand Up @@ -1286,7 +1286,8 @@ const AVCodec ff_ffv1_encoder = {
.init = encode_init,
.encode2 = encode_frame,
.close = encode_close,
.capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_DELAY,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_SLICE_THREADS,
.pix_fmts = (const enum AVPixelFormat[]) {
AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV444P,
AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV411P,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/flashsv2enc.c
Expand Up @@ -903,6 +903,7 @@ const AVCodec ff_flashsv2_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Flash Screen Video Version 2"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_FLASHSV2,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(FlashSV2Context),
.init = flashsv2_encode_init,
.encode2 = flashsv2_encode_frame,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/flashsvenc.c
Expand Up @@ -262,6 +262,7 @@ const AVCodec ff_flashsv_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Flash Screen Video"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_FLASHSV,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(FlashSVContext),
.init = flashsv_encode_init,
.encode2 = flashsv_encode_frame,
Expand Down
3 changes: 2 additions & 1 deletion libavcodec/frame_thread_encoder.c
Expand Up @@ -99,7 +99,8 @@ static void * attribute_align_arg worker(void *v){

ret = avctx->codec->encode2(avctx, pkt, frame, &task->got_packet);
if (task->got_packet) {
if (ret < 0 || pkt->data && (ret = av_packet_make_refcounted(pkt)) < 0)
if (ret < 0 ||
pkt->data && (ret = ff_encode_make_refcounted(c->parent_avctx, pkt)) < 0)
task->got_packet = 0;
else
pkt->pts = pkt->dts = frame->pts;
Expand Down
1 change: 1 addition & 0 deletions libavcodec/gif.c
Expand Up @@ -557,6 +557,7 @@ const AVCodec ff_gif_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("GIF (Graphics Interchange Format)"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_GIF,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(GIFContext),
.init = gif_encode_init,
.encode2 = gif_encode_frame,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/hapenc.c
Expand Up @@ -355,6 +355,7 @@ const AVCodec ff_hap_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Vidvox Hap"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_HAP,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(HapContext),
.priv_class = &hapenc_class,
.init = hap_init,
Expand Down
4 changes: 2 additions & 2 deletions libavcodec/huffyuvenc.c
Expand Up @@ -1053,11 +1053,11 @@ const AVCodec ff_huffyuv_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_HUFFYUV,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
.priv_data_size = sizeof(HYuvContext),
.init = encode_init,
.encode2 = encode_frame,
.close = encode_end,
.capabilities = AV_CODEC_CAP_FRAME_THREADS,
.priv_class = &normal_class,
.pix_fmts = (const enum AVPixelFormat[]){
AV_PIX_FMT_YUV422P, AV_PIX_FMT_RGB24,
Expand All @@ -1073,11 +1073,11 @@ const AVCodec ff_ffvhuff_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_FFVHUFF,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
.priv_data_size = sizeof(HYuvContext),
.init = encode_init,
.encode2 = encode_frame,
.close = encode_end,
.capabilities = AV_CODEC_CAP_FRAME_THREADS,
.priv_class = &ff_class,
.pix_fmts = (const enum AVPixelFormat[]){
AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV411P,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/j2kenc.c
Expand Up @@ -1839,6 +1839,7 @@ const AVCodec ff_jpeg2000_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_JPEG2000,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(Jpeg2000EncoderContext),
.init = j2kenc_init,
.encode2 = encode_frame,
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/lclenc.c
Expand Up @@ -165,11 +165,11 @@ const AVCodec ff_zlib_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_ZLIB,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
.priv_data_size = sizeof(LclEncContext),
.init = encode_init,
.encode2 = encode_frame,
.close = encode_end,
.capabilities = AV_CODEC_CAP_FRAME_THREADS,
.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_BGR24, AV_PIX_FMT_NONE },
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
FF_CODEC_CAP_INIT_CLEANUP,
Expand Down
3 changes: 2 additions & 1 deletion libavcodec/libfdk-aacenc.c
Expand Up @@ -464,11 +464,12 @@ const AVCodec ff_libfdk_aac_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Fraunhofer FDK AAC"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_AAC,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_SMALL_LAST_FRAME,
.priv_data_size = sizeof(AACContext),
.init = aac_encode_init,
.encode2 = aac_encode_frame,
.close = aac_encode_close,
.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_NONE },
.priv_class = &aac_enc_class,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/libilbc.c
Expand Up @@ -204,6 +204,7 @@ const AVCodec ff_libilbc_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("iLBC (Internet Low Bitrate Codec)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_ILBC,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(ILBCEncContext),
.init = ilbc_encode_init,
.encode2 = ilbc_encode_frame,
Expand Down
3 changes: 2 additions & 1 deletion libavcodec/libopencore-amr.c
Expand Up @@ -291,11 +291,12 @@ const AVCodec ff_libopencore_amrnb_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_AMR_NB,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_SMALL_LAST_FRAME,
.priv_data_size = sizeof(AMRContext),
.init = amr_nb_encode_init,
.encode2 = amr_nb_encode_frame,
.close = amr_nb_encode_close,
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SMALL_LAST_FRAME,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_NONE },
.priv_class = &amrnb_class,
Expand Down
3 changes: 2 additions & 1 deletion libavcodec/libopusenc.c
Expand Up @@ -585,11 +585,12 @@ const AVCodec ff_libopus_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("libopus Opus"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_OPUS,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_SMALL_LAST_FRAME,
.priv_data_size = sizeof(LibopusEncContext),
.init = libopus_encode_init,
.encode2 = libopus_encode,
.close = libopus_encode_close,
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SMALL_LAST_FRAME,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_FLT,
AV_SAMPLE_FMT_NONE },
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/libspeexenc.c
Expand Up @@ -352,11 +352,11 @@ const AVCodec ff_libspeex_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("libspeex Speex"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_SPEEX,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
.priv_data_size = sizeof(LibSpeexEncContext),
.init = encode_init,
.encode2 = encode_frame,
.close = encode_close,
.capabilities = AV_CODEC_CAP_DELAY,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_NONE },
.channel_layouts = (const uint64_t[]){ AV_CH_LAYOUT_MONO,
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/libtwolame.c
Expand Up @@ -212,11 +212,11 @@ const AVCodec ff_libtwolame_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("libtwolame MP2 (MPEG audio layer 2)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_MP2,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
.priv_data_size = sizeof(TWOLAMEContext),
.init = twolame_encode_init,
.encode2 = twolame_encode_frame,
.close = twolame_encode_close,
.capabilities = AV_CODEC_CAP_DELAY,
.defaults = twolame_defaults,
.priv_class = &twolame_class,
.sample_fmts = (const enum AVSampleFormat[]) {
Expand Down
1 change: 1 addition & 0 deletions libavcodec/libvo-amrwbenc.c
Expand Up @@ -146,6 +146,7 @@ const AVCodec ff_libvo_amrwbenc_encoder = {
"(Adaptive Multi-Rate Wide-Band)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_AMR_WB,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(AMRWBContext),
.init = amr_wb_encode_init,
.encode2 = amr_wb_encode_frame,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/libxvid.c
Expand Up @@ -904,6 +904,7 @@ const AVCodec ff_libxvid_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("libxvidcore MPEG-4 part 2"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_MPEG4,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(struct xvid_context),
.init = xvid_encode_init,
.encode2 = xvid_encode_frame,
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/ljpegenc.c
Expand Up @@ -327,12 +327,12 @@ const AVCodec ff_ljpeg_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("Lossless JPEG"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_LJPEG,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
.priv_data_size = sizeof(LJpegEncContext),
.priv_class = &ljpeg_class,
.init = ljpeg_encode_init,
.encode2 = ljpeg_encode_frame,
.close = ljpeg_encode_close,
.capabilities = AV_CODEC_CAP_FRAME_THREADS,
.pix_fmts = (const enum AVPixelFormat[]){
AV_PIX_FMT_BGR24 , AV_PIX_FMT_BGRA , AV_PIX_FMT_BGR0,
AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P,
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/magicyuvenc.c
Expand Up @@ -562,12 +562,12 @@ const AVCodec ff_magicyuv_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("MagicYUV video"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_MAGICYUV,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
.priv_data_size = sizeof(MagicYUVContext),
.priv_class = &magicyuv_class,
.init = magy_encode_init,
.close = magy_encode_close,
.encode2 = magy_encode_frame,
.capabilities = AV_CODEC_CAP_FRAME_THREADS,
.pix_fmts = (const enum AVPixelFormat[]) {
AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, AV_PIX_FMT_YUV422P,
AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P, AV_PIX_FMT_GRAY8,
Expand Down
6 changes: 4 additions & 2 deletions libavcodec/mlpenc.c
Expand Up @@ -2374,11 +2374,12 @@ const AVCodec ff_mlp_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_MLP,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SMALL_LAST_FRAME |
AV_CODEC_CAP_EXPERIMENTAL,
.priv_data_size = sizeof(MLPEncodeContext),
.init = mlp_encode_init,
.encode2 = mlp_encode_frame,
.close = mlp_encode_close,
.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_EXPERIMENTAL,
.sample_fmts = (const enum AVSampleFormat[]) {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE},
.supported_samplerates = (const int[]) {44100, 48000, 88200, 96000, 176400, 192000, 0},
.channel_layouts = ff_mlp_channel_layouts,
Expand All @@ -2391,11 +2392,12 @@ const AVCodec ff_truehd_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("TrueHD"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_TRUEHD,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SMALL_LAST_FRAME |
AV_CODEC_CAP_EXPERIMENTAL,
.priv_data_size = sizeof(MLPEncodeContext),
.init = mlp_encode_init,
.encode2 = mlp_encode_frame,
.close = mlp_encode_close,
.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_EXPERIMENTAL,
.sample_fmts = (const enum AVSampleFormat[]) {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE},
.supported_samplerates = (const int[]) {44100, 48000, 88200, 96000, 176400, 192000, 0},
.channel_layouts = (const uint64_t[]) {AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT0_BACK, AV_CH_LAYOUT_5POINT1_BACK, 0},
Expand Down
1 change: 1 addition & 0 deletions libavcodec/mpegaudioenc_fixed.c
Expand Up @@ -26,6 +26,7 @@ const AVCodec ff_mp2fixed_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("MP2 fixed point (MPEG audio layer 2)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_MP2,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(MpegAudioContext),
.init = MPA_encode_init,
.encode2 = MPA_encode_frame,
Expand Down
1 change: 1 addition & 0 deletions libavcodec/mpegaudioenc_float.c
Expand Up @@ -27,6 +27,7 @@ const AVCodec ff_mp2_encoder = {
.long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_MP2,
.capabilities = AV_CODEC_CAP_DR1,
.priv_data_size = sizeof(MpegAudioContext),
.init = MPA_encode_init,
.encode2 = MPA_encode_frame,
Expand Down

0 comments on commit 4c06a1e

Please sign in to comment.