summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/movenc.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index e6b3ea7ef1..f9fc4d5c07 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -5504,6 +5504,25 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
memset(trk->vos_data + trk->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
}
+ if ((par->codec_id == AV_CODEC_ID_DNXHD ||
+ par->codec_id == AV_CODEC_ID_H264 ||
+ par->codec_id == AV_CODEC_ID_HEVC ||
+ par->codec_id == AV_CODEC_ID_TRUEHD ||
+ par->codec_id == AV_CODEC_ID_AC3 ||
+ par->codec_id == AV_CODEC_ID_H264 ||
+ par->codec_id == AV_CODEC_ID_HEVC) && !trk->vos_len &&
+ !TAG_IS_AVCI(trk->tag)) {
+ /* copy frame to create needed atoms */
+ trk->vos_len = size;
+ trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!trk->vos_data) {
+ ret = AVERROR(ENOMEM);
+ goto err;
+ }
+ memcpy(trk->vos_data, pkt->data, size);
+ memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+ }
+
if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
(AV_RB16(pkt->data) & 0xfff0) == 0xfff0) {
if (!s->streams[pkt->stream_index]->nb_frames) {
@@ -5582,22 +5601,6 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
}
}
- if ((par->codec_id == AV_CODEC_ID_DNXHD ||
- par->codec_id == AV_CODEC_ID_H264 ||
- par->codec_id == AV_CODEC_ID_HEVC ||
- par->codec_id == AV_CODEC_ID_TRUEHD ||
- par->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len) {
- /* copy frame to create needed atoms */
- trk->vos_len = size;
- trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!trk->vos_data) {
- ret = AVERROR(ENOMEM);
- goto err;
- }
- memcpy(trk->vos_data, pkt->data, size);
- memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
- }
-
if (trk->entry >= trk->cluster_capacity) {
unsigned new_capacity = trk->entry + MOV_INDEX_CLUSTER_SIZE;
if (av_reallocp_array(&trk->cluster, new_capacity,