Commit 58aa0ed8 authored by James Almer's avatar James Almer

aformat/movenc: add missing padding to output track extradata

Fixes ticket #8183.
Tested-by: 's avatarThierry Foucu <tfoucu@gmail.com>
Signed-off-by: 's avatarJames Almer <jamrial@gmail.com>
parent b9f8ab3e
...@@ -5378,12 +5378,13 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -5378,12 +5378,13 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
!TAG_IS_AVCI(trk->tag) && !TAG_IS_AVCI(trk->tag) &&
(par->codec_id != AV_CODEC_ID_DNXHD)) { (par->codec_id != AV_CODEC_ID_DNXHD)) {
trk->vos_len = par->extradata_size; trk->vos_len = par->extradata_size;
trk->vos_data = av_malloc(trk->vos_len); trk->vos_data = av_malloc(trk->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
if (!trk->vos_data) { if (!trk->vos_data) {
ret = AVERROR(ENOMEM); ret = AVERROR(ENOMEM);
goto err; goto err;
} }
memcpy(trk->vos_data, par->extradata, trk->vos_len); memcpy(trk->vos_data, par->extradata, trk->vos_len);
memset(trk->vos_data + trk->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
} }
if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 && if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
...@@ -5461,12 +5462,13 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -5461,12 +5462,13 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
par->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len) { par->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len) {
/* copy frame to create needed atoms */ /* copy frame to create needed atoms */
trk->vos_len = size; trk->vos_len = size;
trk->vos_data = av_malloc(size); trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
if (!trk->vos_data) { if (!trk->vos_data) {
ret = AVERROR(ENOMEM); ret = AVERROR(ENOMEM);
goto err; goto err;
} }
memcpy(trk->vos_data, pkt->data, size); memcpy(trk->vos_data, pkt->data, size);
memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
} }
if (trk->entry >= trk->cluster_capacity) { if (trk->entry >= trk->cluster_capacity) {
...@@ -6091,12 +6093,13 @@ static int mov_create_dvd_sub_decoder_specific_info(MOVTrack *track, ...@@ -6091,12 +6093,13 @@ static int mov_create_dvd_sub_decoder_specific_info(MOVTrack *track,
cur += strspn(cur, "\n\r"); cur += strspn(cur, "\n\r");
} }
if (have_palette) { if (have_palette) {
track->vos_data = av_malloc(16*4); track->vos_data = av_malloc(16*4 + AV_INPUT_BUFFER_PADDING_SIZE);
if (!track->vos_data) if (!track->vos_data)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
AV_WB32(track->vos_data + i * 4, palette[i]); AV_WB32(track->vos_data + i * 4, palette[i]);
} }
memset(track->vos_data + 16*4, 0, AV_INPUT_BUFFER_PADDING_SIZE);
track->vos_len = 16 * 4; track->vos_len = 16 * 4;
} }
st->codecpar->width = width; st->codecpar->width = width;
...@@ -6454,11 +6457,12 @@ static int mov_write_header(AVFormatContext *s) ...@@ -6454,11 +6457,12 @@ static int mov_write_header(AVFormatContext *s)
mov_create_dvd_sub_decoder_specific_info(track, st); mov_create_dvd_sub_decoder_specific_info(track, st);
else if (!TAG_IS_AVCI(track->tag) && st->codecpar->codec_id != AV_CODEC_ID_DNXHD) { else if (!TAG_IS_AVCI(track->tag) && st->codecpar->codec_id != AV_CODEC_ID_DNXHD) {
track->vos_len = st->codecpar->extradata_size; track->vos_len = st->codecpar->extradata_size;
track->vos_data = av_malloc(track->vos_len); track->vos_data = av_malloc(track->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
if (!track->vos_data) { if (!track->vos_data) {
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
memcpy(track->vos_data, st->codecpar->extradata, track->vos_len); memcpy(track->vos_data, st->codecpar->extradata, track->vos_len);
memset(track->vos_data + track->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
} }
} }
...@@ -6714,10 +6718,11 @@ static int mov_write_trailer(AVFormatContext *s) ...@@ -6714,10 +6718,11 @@ static int mov_write_trailer(AVFormatContext *s)
AVCodecParameters *par = track->par; AVCodecParameters *par = track->par;
track->vos_len = par->extradata_size; track->vos_len = par->extradata_size;
track->vos_data = av_malloc(track->vos_len); track->vos_data = av_malloc(track->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
if (!track->vos_data) if (!track->vos_data)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
memcpy(track->vos_data, par->extradata, track->vos_len); memcpy(track->vos_data, par->extradata, track->vos_len);
memset(track->vos_data + track->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
} }
mov->need_rewrite_extradata = 0; mov->need_rewrite_extradata = 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment