diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-09-20 19:31:24 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-09-20 19:43:38 +0200 |
commit | b8044972c4f23e2d2fdf2c5a8ba67019a5045149 (patch) | |
tree | efef28d683123a9609eb2aba36be6ad4c197da0b /libavformat/matroskaenc.c | |
parent | 0da50055ebafb7852e80825abd0b8e5e72bd8b60 (diff) | |
parent | 117d8c6d1f1c187ffc6098d9618457e00534e013 (diff) |
Merge commit '117d8c6d1f1c187ffc6098d9618457e00534e013'
* commit '117d8c6d1f1c187ffc6098d9618457e00534e013':
matroska: implement support for ProRes
matroska: implement support for ALAC
Conflicts:
libavformat/matroskaenc.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/matroskaenc.c')
-rw-r--r-- | libavformat/matroskaenc.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index f7438f28f4..4fd30b86fb 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -475,8 +475,16 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, AVCodecCo ret = ff_flac_write_header(dyn_cp, codec, 1); else if (codec->codec_id == AV_CODEC_ID_H264) ret = ff_isom_write_avcc(dyn_cp, codec->extradata, codec->extradata_size); - else if (codec->codec_id == AV_CODEC_ID_ALAC && (12 < codec->extradata_size)) - ret = ff_isom_write_avcc(dyn_cp, codec->extradata + 12, codec->extradata_size - 12); + else if (codec->codec_id == AV_CODEC_ID_ALAC) { + if (codec->extradata_size < 36) { + av_log(s, AV_LOG_ERROR, + "Invalid extradata found, ALAC expects a 36-byte " + "QuickTime atom."); + ret = AVERROR_INVALIDDATA; + } else + avio_write(dyn_cp, codec->extradata + 12, + codec->extradata_size - 12); + } else if (codec->extradata_size) avio_write(dyn_cp, codec->extradata, codec->extradata_size); } else if (codec->codec_type == AVMEDIA_TYPE_VIDEO) { @@ -1061,7 +1069,7 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, MatroskaMuxContext *mkv = s->priv_data; AVCodecContext *codec = s->streams[pkt->stream_index]->codec; uint8_t *data = NULL; - int size = pkt->size; + int offset = 0, size = pkt->size; int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts; av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, " @@ -1072,12 +1080,20 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, ff_avc_parse_nal_units_buf(pkt->data, &data, &size); else data = pkt->data; + + if (codec->codec_id == AV_CODEC_ID_PRORES) { + /* Matroska specification requires to remove the first QuickTime atom + */ + size -= 8; + offset = 8; + } + put_ebml_id(pb, blockid); put_ebml_num(pb, size+4, 0); avio_w8(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 avio_wb16(pb, ts - mkv->cluster_pts); avio_w8(pb, flags); - avio_write(pb, data, size); + avio_write(pb, data + offset, size); if (data != pkt->data) av_free(data); } |