Use "sd_size" instead of "pkt_pal_size".
-- Mats Peterson http://matsp888.no-ip.org/~mats/
>From 7a94429c9d09785309deeccecfce23c468c09e84 Mon Sep 17 00:00:00 2001 From: Mats Peterson <matsp...@yahoo.com> Date: Sun, 28 Feb 2016 10:55:39 +0100 Subject: [PATCH v4 2/2] lavf/movenc: Add support for palette side data packets --- libavformat/movenc.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index e0223b2..e068e46 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4760,19 +4760,28 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) } } - if (trk->is_unaligned_qt_rgb) { + if (trk->is_unaligned_qt_rgb && pkt->size) { const uint8_t *data = pkt->data; int size = pkt->size; int64_t bpc = trk->enc->bits_per_coded_sample != 15 ? trk->enc->bits_per_coded_sample : 16; int expected_stride = ((trk->enc->width * bpc + 15) >> 4)*2; + const uint8_t *pal = NULL; + int sd_size; int ret = ff_reshuffle_raw_rgb(s, &pkt, trk->enc, expected_stride); if (ret < 0) return ret; - if (ret == CONTAINS_PAL && !trk->pal_done) { - int pal_size = 1 << trk->enc->bits_per_coded_sample; - memset(trk->palette, 0, AVPALETTE_SIZE); - memcpy(trk->palette, data + size - 4*pal_size, 4*pal_size); - trk->pal_done++; + if (!trk->pal_done) { + pal = (uint8_t *)av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &sd_size); + if (pal && sd_size != AVPALETTE_SIZE) { + av_log(s, AV_LOG_ERROR, "Invalid palette side data\n"); + return AVERROR_INVALIDDATA; + } + if (!pal && ret == CONTAINS_PAL) + pal = data + size - AVPALETTE_SIZE; + if (pal) { + memcpy(trk->palette, pal, AVPALETTE_SIZE); + trk->pal_done++; + } } else if (trk->enc->pix_fmt == AV_PIX_FMT_GRAY8 || trk->enc->pix_fmt == AV_PIX_FMT_MONOBLACK) { for (i = 0; i < pkt->size; i++) -- 1.7.10.4
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel