Moved the nut palette copying code to a more logical place.
The stride will be calculated incorrectly for the attached 3 x 3 pixel pal8 nut file, since there is some padding in the packet after the video data and before the palette. It will be properly rounded down to the real width of the video data for larger sizes, but this one will be 4 instead of 3. I've tried a 1x1 file, but that one wouldn't play at all. Anyway, run ffplay with "-v debug" to output the packet size and the stride.
If you have a better solution, feel free to change the stride calculation code.
Original description:This patch removes the monowhite switching code for 1 bpp raw AVI without a palette. I don't see any reason to keep it, since it's semantically incorrect to use monowhite for palettized data in my book, it adds unnecessary noise to the code, and it's inconsistent with the rest of the code in FFmpeg.
For black & white AVI or QuickTime files, in order to produce a monochrome nut file, force the pixel format with "-pix_fmt monow" or "-pix_fmt monob".
Unfortunately, there is a problem with converting from pal8 to monow, and I know what it is now. There seems to be some weird dithering going on of the white color, so there will be black pixels here and there in the monow output. A better way is to use "ffmpeg -i 1bpp.avi -vcodec copy -vtag B1W0 1bpp.nut". The "-vtag" option is currently needed, otherwise FFmpeg will use a RGB[15] codec tag for some reason.
I have also updated the 1 bpp FATE test files (once again). Mats
>From 4eb101f9b022240861df1386811a3d71b9e710a7 Mon Sep 17 00:00:00 2001 From: Mats Peterson <matsp...@yahoo.com> Date: Wed, 10 Feb 2016 23:55:41 +0100 Subject: [PATCH v7] lavc/rawdec: Remove monowhite switching code for 1 bpp AVI without a palette --- libavcodec/rawdec.c | 62 ++++++++++++++----------------------- tests/ref/vsynth/vsynth1-bpp1 | 4 +-- tests/ref/vsynth/vsynth2-bpp1 | 4 +-- tests/ref/vsynth/vsynth3-bpp1 | 4 +-- tests/ref/vsynth/vsynth_lena-bpp1 | 4 +-- 5 files changed, 31 insertions(+), 47 deletions(-) diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c index b7ce2b6..83ca576 100644 --- a/libavcodec/rawdec.c +++ b/libavcodec/rawdec.c @@ -100,7 +100,7 @@ static av_cold int raw_init_decoder(AVCodecContext *avctx) avpriv_set_systematic_pal2((uint32_t*)context->palette->data, avctx->pix_fmt); else { memset(context->palette->data, 0, AVPALETTE_SIZE); - if (avctx->bits_per_coded_sample <= 1) + if (avctx->bits_per_coded_sample == 1) memset(context->palette->data, 0xff, 4); } } @@ -121,17 +121,13 @@ static av_cold int raw_init_decoder(AVCodecContext *avctx) if (avctx->codec_tag == MKTAG('B','1','W','0') || avctx->codec_tag == MKTAG('B','0','W','1')) context->is_nut_mono = 1; - else if (avctx->codec_tag == MKTAG('P','A','L','8')) + else if (avctx->codec_tag == MKTAG('P','A','L',8)) context->is_nut_pal8 = 1; if (avctx->codec_tag == AV_RL32("yuv2") && avctx->pix_fmt == AV_PIX_FMT_YUYV422) context->is_yuv2 = 1; - /* Temporary solution until PAL8 is implemented in nut */ - if (context->is_pal8 && avctx->bits_per_coded_sample == 1) - avctx->pix_fmt = AV_PIX_FMT_NONE; - return 0; } @@ -192,33 +188,16 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame, return AVERROR_INVALIDDATA; } - if (context->is_nut_mono) - stride = avctx->width / 8 + (avctx->width & 7 ? 1 : 0); - else if (context->is_nut_pal8) - stride = avctx->width; - else - stride = avpkt->size / avctx->height; + stride = (avpkt->size - (context->is_nut_pal8 ? AVPALETTE_SIZE : 0)) / avctx->height; + + av_log(avctx, AV_LOG_DEBUG, "PACKET SIZE: %d\n", avpkt->size); + av_log(avctx, AV_LOG_DEBUG, "STRIDE: %d\n", stride); - if (stride == 0 || avpkt->size < stride * avctx->height) { + if (stride <= 0 || avpkt->size < stride * avctx->height) { av_log(avctx, AV_LOG_ERROR, "Packet too small (%d)\n", avpkt->size); return AVERROR_INVALIDDATA; } - /* Temporary solution until PAL8 is implemented in nut */ - if (avctx->pix_fmt == AV_PIX_FMT_NONE && - avctx->bits_per_coded_sample == 1 && - avctx->frame_number == 0 && - context->palette && - AV_RB64(context->palette->data) == 0xFFFFFFFF00000000 - ) { - const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); - if (!pal) { - avctx->pix_fmt = AV_PIX_FMT_MONOWHITE; - context->is_pal8 = 0; - context->is_mono = 1; - } else - avctx->pix_fmt = AV_PIX_FMT_PAL8; - } desc = av_pix_fmt_desc_get(avctx->pix_fmt); if ((avctx->bits_per_coded_sample == 8 || avctx->bits_per_coded_sample == 4 @@ -380,18 +359,23 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame, } if (avctx->pix_fmt == AV_PIX_FMT_PAL8) { - const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, - NULL); - - if (pal) { - av_buffer_unref(&context->palette); - context->palette = av_buffer_alloc(AVPALETTE_SIZE); - if (!context->palette) { - av_buffer_unref(&frame->buf[0]); - return AVERROR(ENOMEM); - } - memcpy(context->palette->data, pal, AVPALETTE_SIZE); + if (context->is_nut_pal8) { + memcpy(context->palette->data, + avpkt->data + avpkt->size - AVPALETTE_SIZE, AVPALETTE_SIZE); frame->palette_has_changed = 1; + } else { + const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, + NULL); + if (pal) { + av_buffer_unref(&context->palette); + context->palette = av_buffer_alloc(AVPALETTE_SIZE); + if (!context->palette) { + av_buffer_unref(&frame->buf[0]); + return AVERROR(ENOMEM); + } + memcpy(context->palette->data, pal, AVPALETTE_SIZE); + frame->palette_has_changed = 1; + } } } diff --git a/tests/ref/vsynth/vsynth1-bpp1 b/tests/ref/vsynth/vsynth1-bpp1 index 32dab11..378f990 100644 --- a/tests/ref/vsynth/vsynth1-bpp1 +++ b/tests/ref/vsynth/vsynth1-bpp1 @@ -1,4 +1,4 @@ 3e5e0f4afb3a0350440e86b1ea56cec9 *tests/data/fate/vsynth1-bpp1.avi 640452 tests/data/fate/vsynth1-bpp1.avi -ccef5f5d5b0392f1d01c200499dac657 *tests/data/fate/vsynth1-bpp1.out.rawvideo -stddev: 97.30 PSNR: 8.37 MAXDIFF: 237 bytes: 7603200/ 7603200 +853694f3c1aa3ef3807ab1fccbeefe7b *tests/data/fate/vsynth1-bpp1.out.rawvideo +stddev: 84.44 PSNR: 9.60 MAXDIFF: 221 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth2-bpp1 b/tests/ref/vsynth/vsynth2-bpp1 index d010bbd..ae8fd27 100644 --- a/tests/ref/vsynth/vsynth2-bpp1 +++ b/tests/ref/vsynth/vsynth2-bpp1 @@ -1,4 +1,4 @@ 771437c9038b44f4e2d4ff764c1c3821 *tests/data/fate/vsynth2-bpp1.avi 640452 tests/data/fate/vsynth2-bpp1.avi -ba70b5aebc786e625af6bd7f7ec82717 *tests/data/fate/vsynth2-bpp1.out.rawvideo -stddev: 81.63 PSNR: 9.89 MAXDIFF: 237 bytes: 7603200/ 7603200 +94261fc8aa20130cbd4361e15b742ef7 *tests/data/fate/vsynth2-bpp1.out.rawvideo +stddev: 70.29 PSNR: 11.19 MAXDIFF: 221 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth3-bpp1 b/tests/ref/vsynth/vsynth3-bpp1 index f84808a..6f71248 100644 --- a/tests/ref/vsynth/vsynth3-bpp1 +++ b/tests/ref/vsynth/vsynth3-bpp1 @@ -1,4 +1,4 @@ a5e6d1eff2f6fc3bba31e3bb8753b905 *tests/data/fate/vsynth3-bpp1.avi 15352 tests/data/fate/vsynth3-bpp1.avi -75e8ee0c0b0ada4515455d9f29377a16 *tests/data/fate/vsynth3-bpp1.out.rawvideo -stddev: 97.70 PSNR: 8.33 MAXDIFF: 248 bytes: 86700/ 86700 +79076b5fc43ee2a2284c0cde991d21f3 *tests/data/fate/vsynth3-bpp1.out.rawvideo +stddev: 84.88 PSNR: 9.55 MAXDIFF: 232 bytes: 86700/ 86700 diff --git a/tests/ref/vsynth/vsynth_lena-bpp1 b/tests/ref/vsynth/vsynth_lena-bpp1 index d4570c7..3e250a8 100644 --- a/tests/ref/vsynth/vsynth_lena-bpp1 +++ b/tests/ref/vsynth/vsynth_lena-bpp1 @@ -1,4 +1,4 @@ d53d08c755ffde5fca744f0f941bfcb1 *tests/data/fate/vsynth_lena-bpp1.avi 640452 tests/data/fate/vsynth_lena-bpp1.avi -9a66df9009670b0a593d889975246c00 *tests/data/fate/vsynth_lena-bpp1.out.rawvideo -stddev: 96.36 PSNR: 8.45 MAXDIFF: 233 bytes: 7603200/ 7603200 +dce624117fcd2b16f38e0a0a62b13fa7 *tests/data/fate/vsynth_lena-bpp1.out.rawvideo +stddev: 83.18 PSNR: 9.73 MAXDIFF: 217 bytes: 7603200/ 7603200 -- 1.7.10.4
3x3.nut
Description: Binary data
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel