summaryrefslogtreecommitdiffstats
path: root/libavformat/matroskaenc.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2018-08-10 23:25:32 -0300
committerJames Almer <jamrial@gmail.com>2018-08-18 23:32:44 -0300
commitde1b44c20604c05812ad70167a26d45e0ec1526f (patch)
tree65b10e332639db282bcf1f5dbb52b3ae8fbdbe2d /libavformat/matroskaenc.c
parent223d2bde22ce33dcbcb6f17f234b609cb98f1fb6 (diff)
downloadffmpeg-streaming-de1b44c20604c05812ad70167a26d45e0ec1526f.zip
ffmpeg-streaming-de1b44c20604c05812ad70167a26d45e0ec1526f.tar.gz
avformat/matroskaenc: handle AV1 extradata in packet side data
This is a temporary workaround for transcoding scenarious using libaom-av1 encoder, which currently can't propagate extradata during initialization. Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/matroskaenc.c')
-rw-r--r--libavformat/matroskaenc.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 816ddd0..09a62e1 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -771,8 +771,12 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb,
par->extradata_size, 0);
return 0;
case AV_CODEC_ID_AV1:
- return ff_isom_write_av1c(dyn_cp, par->extradata,
- par->extradata_size);
+ if (par->extradata_size)
+ return ff_isom_write_av1c(dyn_cp, par->extradata,
+ par->extradata_size);
+ else
+ put_ebml_void(pb, 4 + 3);
+ break;
case AV_CODEC_ID_ALAC:
if (par->extradata_size < 36) {
av_log(s, AV_LOG_ERROR,
@@ -2325,6 +2329,37 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt)
avcodec_parameters_free(&codecpriv_par);
}
break;
+ // FIXME: Remove the following once libaom starts propagating extradata during init()
+ // See https://bugs.chromium.org/p/aomedia/issues/detail?id=2012
+ case AV_CODEC_ID_AV1:
+ if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live &&
+ !par->extradata_size) {
+ AVIOContext *dyn_cp;
+ uint8_t *codecpriv;
+ int codecpriv_size;
+ int64_t curpos;
+ ret = avio_open_dyn_buf(&dyn_cp);
+ if (ret < 0)
+ return ret;
+ ff_isom_write_av1c(dyn_cp, side_data, side_data_size);
+ codecpriv_size = avio_close_dyn_buf(dyn_cp, &codecpriv);
+ if (!codecpriv_size) {
+ av_free(codecpriv);
+ return AVERROR_INVALIDDATA;
+ }
+ curpos = avio_tell(mkv->tracks_bc);
+ avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET);
+ // Do not write the OBUs as we don't have space saved for them
+ put_ebml_binary(mkv->tracks_bc, MATROSKA_ID_CODECPRIVATE, codecpriv, 4);
+ av_free(codecpriv);
+ avio_seek(mkv->tracks_bc, curpos, SEEK_SET);
+ ret = ff_alloc_extradata(par, side_data_size);
+ if (ret < 0)
+ return ret;
+ memcpy(par->extradata, side_data, side_data_size);
+ } else if (!par->extradata_size)
+ return AVERROR_INVALIDDATA;
+ break;
default:
if (side_data_size)
av_log(s, AV_LOG_DEBUG, "Ignoring new extradata in a packet for stream %d.\n", pkt->stream_index);
OpenPOWER on IntegriCloud