[FFmpeg-devel] [PATCH v3] lavc/rawdec: Use AV_PIX_FMT_PAL8 for 1-bit raw AVI video
Michael Niedermayer
michael at niedermayer.cc
Mon Jan 25 01:26:40 CET 2016
On Wed, Jan 20, 2016 at 12:41:22PM +0100, Mats Peterson wrote:
> I don't know about this one, since it adds some calculations inside
> the loop, but it limits the line alignment to 16 bytes instead of 32
> bytes as before. Less overhead.
>
> Mats
>
> --
> Mats Peterson
> http://matsp888.no-ip.org/~mats/
> raw.c | 2 +-
> rawdec.c | 38 ++++++++++++++++++++++++--------------
> 2 files changed, 25 insertions(+), 15 deletions(-)
> 3c94aff2647b8a1b0e9c4c147b552c85255253ff 0001-v3.patch
> From 8d15b348fc84d46f7e764a2e9822aacc80e74407 Mon Sep 17 00:00:00 2001
> From: Mats Peterson <matsp888 at yahoo.com>
> Date: Wed, 20 Jan 2016 12:37:40 +0100
> Subject: [PATCH v3] lavc/rawdec: Use AV_PIX_FMT_PAL8 for 1-bit raw AVI video
>
> The stuff about 1-bit video not necessarily being black & white in
> QuickTime goes for AVI as well. Being 1 bit per pixel only means that
> the data is bi-level. The two colors can be any color. Since many
> 1 bpp AVI files don't have a palette following the BITMAPINFOHEADER,
> I'm setting a "default" black & white palette in raw_init().
Does the official player from microsoft play such crafted avi files
with the palette colors or black and white ?
[...]
> @@ -94,8 +94,11 @@ static av_cold int raw_init_decoder(AVCodecContext *avctx)
> return AVERROR(ENOMEM);
> if (desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL)
> avpriv_set_systematic_pal2((uint32_t*)context->palette->data, avctx->pix_fmt);
> - else
> + else {
> memset(context->palette->data, 0, AVPALETTE_SIZE);
> + if (avctx->bits_per_coded_sample == 1)
> + memset(context->palette->data, 0xff, 4);
> + }
hunk split out and applied
[...]
> @@ -222,18 +225,25 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame,
> }
> linesize_align = 16;
> } else {
> + int j, row_pix = 0;
> av_assert0(avctx->bits_per_coded_sample == 1);
> - for (i = 0; 8 * i + 7 < buf_size && i<avpkt->size; i++) {
> - dst[8 * i + 0] = buf[i] >> 7 & 1;
> - dst[8 * i + 1] = buf[i] >> 6 & 1;
> - dst[8 * i + 2] = buf[i] >> 5 & 1;
> - dst[8 * i + 3] = buf[i] >> 4 & 1;
> - dst[8 * i + 4] = buf[i] >> 3 & 1;
> - dst[8 * i + 5] = buf[i] >> 2 & 1;
> - dst[8 * i + 6] = buf[i] >> 1 & 1;
> - dst[8 * i + 7] = buf[i] & 1;
> + for (i = 0, j = 0; 8 * j + 7 < buf_size && i<avpkt->size; i++, j++) {
> + dst[8 * j + 0] = buf[i] >> 7 & 1;
> + dst[8 * j + 1] = buf[i] >> 6 & 1;
> + dst[8 * j + 2] = buf[i] >> 5 & 1;
> + dst[8 * j + 3] = buf[i] >> 4 & 1;
> + dst[8 * j + 4] = buf[i] >> 3 & 1;
> + dst[8 * j + 5] = buf[i] >> 2 & 1;
> + dst[8 * j + 6] = buf[i] >> 1 & 1;
> + dst[8 * j + 7] = buf[i] & 1;
> + row_pix += 8;
> + if (row_pix >= avctx->width) {
> + i += 4 - (i % 4) - 1;
> + j += 2 - (j % 2) - 1;
> + row_pix = 0;
> + }
> }
> - linesize_align = 32;
> + linesize_align = 16;
> }
hunk split out and applied
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Everything should be made as simple as possible, but not simpler.
-- Albert Einstein
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160125/c4750079/attachment.sig>
More information about the ffmpeg-devel
mailing list