Remove unnecessary cast to uint8_t for av_packet_get_side_data().
>From 50f56cd66ac52e8eea2210fc4ed2189d3311a9f4 Mon Sep 17 00:00:00 2001
From: Mats Peterson <[email protected]>
Date: Sun, 28 Feb 2016 13:19:43 +0100
Subject: [PATCH v5 1/2] lavf/avienc: Add support for palette side data packets
---
libavformat/avienc.c | 61 +++++++++++++++++++++++++++++---------------------
1 file changed, 35 insertions(+), 26 deletions(-)
diff --git a/libavformat/avienc.c b/libavformat/avienc.c
index ca505f4..aa73701 100644
--- a/libavformat/avienc.c
+++ b/libavformat/avienc.c
@@ -362,7 +362,8 @@ static int avi_write_header(AVFormatContext *s)
&& enc->pix_fmt == AV_PIX_FMT_RGB555LE
&& enc->bits_per_coded_sample == 15)
enc->bits_per_coded_sample = 16;
- avist->pal_offset = avio_tell(pb) + 40;
+ if (pb->seekable)
+ avist->pal_offset = avio_tell(pb) + 40;
ff_put_bmp_header(pb, enc, ff_codec_bmp_tags, 0, 0);
pix_fmt = avpriv_find_pix_fmt(avpriv_pix_fmt_bps_avi,
enc->bits_per_coded_sample);
@@ -668,39 +669,47 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
if ((ret = write_skip_frames(s, stream_index, pkt->dts)) < 0)
return ret;
- if (enc->codec_id == AV_CODEC_ID_RAWVIDEO && enc->codec_tag == 0) {
+ if (enc->codec_id == AV_CODEC_ID_RAWVIDEO && enc->codec_tag == 0 && size) {
int64_t bpc = enc->bits_per_coded_sample != 15 ? enc->bits_per_coded_sample : 16;
int expected_stride = ((enc->width * bpc + 31) >> 5)*4;
-
+ const uint8_t *pal = NULL;
+ int pal_size = 1 << enc->bits_per_coded_sample;
+ int sd_size, i;
ret = ff_reshuffle_raw_rgb(s, &pkt, enc, expected_stride);
if (ret < 0)
return ret;
- if (ret) {
- if (ret == CONTAINS_PAL) {
- int pc_tag, i;
- int pal_size = 1 << enc->bits_per_coded_sample;
- if (!avist->hdr_pal_done) {
- int64_t cur_offset = avio_tell(pb);
- avio_seek(pb, avist->pal_offset, SEEK_SET);
- for (i = 0; i < pal_size; i++) {
- uint32_t v = AV_RL32(data + size - 4*pal_size + 4*i);
- avio_wl32(pb, v & 0xffffff);
- }
- avio_seek(pb, cur_offset, SEEK_SET);
- avist->hdr_pal_done++;
- }
- avi_stream2fourcc(tag, stream_index, enc->codec_type);
- tag[2] = 'p'; tag[3] = 'c';
- pc_tag = ff_start_tag(pb, tag);
- avio_w8(pb, 0);
- avio_w8(pb, pal_size & 0xFF);
- avio_wl16(pb, 0); // reserved
+ pal = 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) {
+ int pc_tag;
+ if (pb->seekable && !avist->hdr_pal_done) {
+ int64_t cur_offset = avio_tell(pb);
+ avio_seek(pb, avist->pal_offset, SEEK_SET);
for (i = 0; i < pal_size; i++) {
- uint32_t v = AV_RL32(data + size - 4*pal_size + 4*i);
- avio_wb32(pb, v<<8);
+ uint32_t v = AV_RL32(pal + 4*i);
+ avio_wl32(pb, v & 0xffffff);
}
- ff_end_tag(pb, pc_tag);
+ avio_seek(pb, cur_offset, SEEK_SET);
+ avist->hdr_pal_done++;
}
+ avi_stream2fourcc(tag, stream_index, enc->codec_type);
+ tag[2] = 'p'; tag[3] = 'c';
+ pc_tag = ff_start_tag(pb, tag);
+ avio_w8(pb, 0);
+ avio_w8(pb, pal_size & 0xFF);
+ avio_wl16(pb, 0); // reserved
+ for (i = 0; i < pal_size; i++) {
+ uint32_t v = AV_RL32(pal + 4*i);
+ avio_wb32(pb, v<<8);
+ }
+ ff_end_tag(pb, pc_tag);
+ }
+ if (ret) {
ret = avi_write_packet_internal(s, pkt);
av_packet_free(&pkt);
return ret;
--
1.7.10.4
_______________________________________________
ffmpeg-devel mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel