jpeg style yuv fixes
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 20 Jan 2005 00:30:20 +0000 (00:30 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 20 Jan 2005 00:30:20 +0000 (00:30 +0000)
Originally committed as revision 3852 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/mjpeg.c
libavcodec/mpegvideo.c
tests/ffmpeg.regression.ref
tests/libav.regression.ref
tests/regression.sh
tests/rotozoom.regression.ref

index b09492d..2edd90b 100644 (file)
@@ -400,6 +400,19 @@ static void jpeg_put_comments(MpegEncContext *s)
         ptr[0] = size >> 8;
         ptr[1] = size;
     }
+
+    if(  s->avctx->pix_fmt == PIX_FMT_YUV420P 
+       ||s->avctx->pix_fmt == PIX_FMT_YUV422P
+       ||s->avctx->pix_fmt == PIX_FMT_YUV444P){
+        put_marker(p, COM);
+        flush_put_bits(p);
+        ptr = pbBufPtr(p);
+        put_bits(p, 16, 0); /* patched later */
+        put_string(p, "CS=ITU601", 1);
+        size = strlen("CS=ITU601")+3;
+        ptr[0] = size >> 8;
+        ptr[1] = size;
+    }
 }
 
 void mjpeg_picture_header(MpegEncContext *s)
@@ -845,6 +858,7 @@ typedef struct MJpegDecodeContext {
     int restart_count;
 
     int buggy_avid;
+    int cs_itu601;
     int interlace_polarity;
 
     int mjpb_skiptosod;
@@ -1133,16 +1147,16 @@ static int mjpeg_decode_sof(MJpegDecodeContext *s)
         if(s->rgb){
             s->avctx->pix_fmt = PIX_FMT_RGBA32;
         }else if(s->nb_components==3)
-            s->avctx->pix_fmt = PIX_FMT_YUV444P;
+            s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV444P : PIX_FMT_YUVJ444P;
         else
             s->avctx->pix_fmt = PIX_FMT_GRAY8;
         break;
     case 0x21:
-        s->avctx->pix_fmt = PIX_FMT_YUV422P;
+        s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV422P : PIX_FMT_YUVJ422P;
         break;
     default:
     case 0x22:
-        s->avctx->pix_fmt = PIX_FMT_YUV420P;
+        s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420P;
         break;
     }
 
@@ -1737,6 +1751,9 @@ static int mjpeg_decode_com(MJpegDecodeContext *s)
                //      if (s->first_picture)
                //          printf("mjpeg: workarounding buggy AVID\n");
            }
+            else if(!strcmp(cbuf, "CS=ITU601")){
+                s->cs_itu601= 1;
+            }
 
            av_free(cbuf);
        }
@@ -2172,7 +2189,7 @@ static int sp5x_decode_frame(AVCodecContext *avctx,
     s->v_max = 2;
     
     s->qscale_table = av_mallocz((s->width+15)/16);
-    avctx->pix_fmt = PIX_FMT_YUV420P;
+    avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420;
     s->interlaced = 0;
     
     s->picture.reference = 0;
index 6a48097..6b5546c 100644 (file)
@@ -892,7 +892,22 @@ int MPV_encode_init(AVCodecContext *avctx)
     
     MPV_encode_defaults(s);
 
-    avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME
+    if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUV420P){
+        av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
+        return -1;
+    }
+
+    if(avctx->codec_id == CODEC_ID_MJPEG || avctx->codec_id == CODEC_ID_LJPEG){
+        if(avctx->strict_std_compliance>=0 && avctx->pix_fmt != PIX_FMT_YUVJ420P){
+            av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
+            return -1;
+        }
+    }else{
+        if(avctx->strict_std_compliance>=0 && avctx->pix_fmt != PIX_FMT_YUV420P){
+            av_log(avctx, AV_LOG_ERROR, "colorspace not supported\n");
+            return -1;
+        }
+    }
 
     s->bit_rate = avctx->bit_rate;
     s->width = avctx->width;
@@ -2259,7 +2274,7 @@ int MPV_encode_picture(AVCodecContext *avctx,
     AVFrame *pic_arg = data;
     int i, stuffing_count;
 
-    if(avctx->pix_fmt != PIX_FMT_YUV420P){
+    if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUVJ420P){
         av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
         return -1;
     }
index be92ab2..2e5fa39 100644 (file)
@@ -87,12 +87,12 @@ stddev:  7.03 PSNR:31.18 bytes:7602176
 1037657 ./data/a-mpeg1b.mpg
 09a77de112e144c562bc1398b111b61b *./data/out.yuv
 stddev:  6.35 PSNR:32.06 bytes:7602176
-07042f42b3119c39eb26537a84a451df *./data/a-mjpeg.avi
-1437768 ./data/a-mjpeg.avi
-f23a9e50a559e174766ee808c48fea22 *./data/out.yuv
-stddev:  8.87 PSNR:29.15 bytes:7602176
-1d565db4a3a054261af95f2483a37cd6 *./data/a-ljpeg.avi
-6262762 ./data/a-ljpeg.avi
+8e69394fdcb19995dfe5cb8c562d9441 *./data/a-mjpeg.avi
+1566544 ./data/a-mjpeg.avi
+18c3a76f984e717dd886d21fa04355f6 *./data/out.yuv
+stddev:  7.93 PSNR:30.13 bytes:7602176
+a534c6fc190682842efc0defda2cd442 *./data/a-ljpeg.avi
+6263462 ./data/a-ljpeg.avi
 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
 stddev:  0.00 PSNR:99.99 bytes:7602176
 49c87af74432890cadb28b93da1c653d *./data/a-rv10.rm
index d94b940..7cc88ce 100644 (file)
@@ -43,7 +43,7 @@ b977a4fedff90a79baf70c8e02986820 *./data/b-libav.yuv4mpeg
 3801810 ./data/b-libav.yuv4mpeg
 ./data/b-libav%d.pgm CRC=84c09106
 ./data/b-libav%d.ppm CRC=25c06ecf
-./data/b-libav%d.jpg CRC=afa6eff5
+./data/b-libav%d.jpg CRC=62328baa
 b0a8c8063d81921db5d7c8f50a1cc454 *./data/b-libav.wav
 89132 ./data/b-libav.wav
 ./data/b-libav.wav CRC=2a09519c
index ddaaf39..70e9e46 100755 (executable)
@@ -360,7 +360,7 @@ fi
 if [ -n "$do_mjpeg" ] ; then
 # mjpeg
 file=${outfile}mjpeg.avi
-do_ffmpeg $file -y -qscale 10 -f pgmyuv -i $raw_src -an -vcodec mjpeg $file
+do_ffmpeg $file -y -qscale 10 -f pgmyuv -i $raw_src -an -vcodec mjpeg -pix_fmt yuvj420p $file
 
 # mjpeg decoding
 do_ffmpeg $raw_dst -y -i $file -f rawvideo $raw_dst 
@@ -370,7 +370,7 @@ fi
 if [ -n "$do_ljpeg" ] ; then
 # ljpeg
 file=${outfile}ljpeg.avi
-do_ffmpeg $file -y -f pgmyuv -i $raw_src -an -vcodec ljpeg $file
+do_ffmpeg $file -y -f pgmyuv -i $raw_src -an -vcodec ljpeg -strict -1 $file
 
 # ljpeg decoding
 do_ffmpeg $raw_dst -y -i $file -f rawvideo $raw_dst 
@@ -601,7 +601,7 @@ do_ffmpeg_crc $file -i $file
 
 # jpeg (we do not do md5 on image files yet)
 file=${outfile}libav%d.jpg
-$ffmpeg -t 0.5 -y -qscale 10 -f pgmyuv -i $raw_src -bitexact -dct_algo 1 -idct_algo 2 -f image2 $file
+$ffmpeg -t 0.5 -y -qscale 10 -f pgmyuv -i $raw_src -bitexact -dct_algo 1 -idct_algo 2 -pix_fmt yuvj420p -f image2 $file
 do_ffmpeg_crc $file -f image2 -i $file
 
 ####################
index 8487b66..7aec1eb 100644 (file)
@@ -87,12 +87,12 @@ stddev:  4.73 PSNR:34.61 bytes:7602176
 231306 ./data/a-mpeg1b.mpg
 c665bd56f8e241f8bf3a5a8f803227c3 *./data/out.yuv
 stddev:  4.13 PSNR:35.78 bytes:7602176
-e9218a1db885fe0262e88f9df630307d *./data/a-mjpeg.avi
-635218 ./data/a-mjpeg.avi
-a365b4da246ad68caf96b702b7f961a1 *./data/out.yuv
-stddev:  4.76 PSNR:34.56 bytes:7602176
-defd90b44bced2772c6ca0d8eb75f668 *./data/a-ljpeg.avi
-4764822 ./data/a-ljpeg.avi
+fab9b15954fe07a7d94ea4fa02af1ca2 *./data/a-mjpeg.avi
+702528 ./data/a-mjpeg.avi
+b1aa72cfb6f9cc3f525b27abc86a8f51 *./data/out.yuv
+stddev:  4.38 PSNR:35.28 bytes:7602176
+29d6f3ca0833ed83cffa279d08e79419 *./data/a-ljpeg.avi
+4765522 ./data/a-ljpeg.avi
 dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
 stddev:  0.00 PSNR:99.99 bytes:7602176
 2123b30d786e6e6e25caf337f24e7834 *./data/a-rv10.rm