diff options
author | James Almer <jamrial@gmail.com> | 2018-08-10 23:25:32 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2018-08-18 23:32:44 -0300 |
commit | de1b44c20604c05812ad70167a26d45e0ec1526f (patch) | |
tree | 65b10e332639db282bcf1f5dbb52b3ae8fbdbe2d /libavformat/matroskaenc.c | |
parent | 223d2bde22ce33dcbcb6f17f234b609cb98f1fb6 (diff) | |
download | ffmpeg-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.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 816ddd059a..09a62e1922 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); |