>In case you're interested, I've *finally* posted smilutils to kino CVS.

Still cool.

 >Please feel free to report issues or patches (or new tools?) via the
 >kino-dev mailing list. 

And here is another patch, to add the 4:1:1 mode I mentioned a few weeks ago.

With the patch, if you specify "-i 2" to smil2yuv, then the output
 stream will be in the 4:1:1 subsampling mode native to NTSC DV ---
 which can then be converted properly to 4:2:0 by y4mscaler.  (The
 subsampling mode is identified by an 'X' tag in the YUV4MPEG2 header.
 This patch also will identify PAL streams as the PAL-DV variant of
 4:2:0, so that they can be processed appropriately by y4mscaler.)

I won't get around to packaging a version of y4mscaler which handles all
 this properly for another week or so.  However, the preliminary testing
 I did last night showed a plainly visible improvement in NTSC DV material.
 I am pleased with myself.

-matt m.

Here is the patch:


Index: extensions/YUV420Extractor.cc
===================================================================
RCS file: /cvsroot/kino/smilutils/extensions/YUV420Extractor.cc,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 YUV420Extractor.cc
--- extensions/YUV420Extractor.cc       11 Feb 2003 13:22:54 -0000      1.1.1.1
+++ extensions/YUV420Extractor.cc       13 Feb 2003 01:46:22 -0000
@@ -45,6 +45,7 @@
                                          << " H" << height 
                                          << " F" << ( height == 576 ? "25:1" : 
"30000:1001" ) 
                                          << (height == 576 ? " Ib A59:54" : " Ib 
A10:11") 
+                                 << (height == 576 ? " XYSCSS=420PALDV" : "")
                                          << std::endl;
 
                        return input != NULL;
@@ -177,6 +178,101 @@
                }
 };
 
+
+/*
+ * Extracts frames with 4:1:1 subsampling for experimental YUV4MPEG2 mode.
+ * Really only for NTSC DV material
+ *
+ */
+class ExtendedYUV411Extractor : public YUV420Extractor
+{
+public:
+  bool Initialise( Frame &frame )
+  {
+    width = frame.GetWidth( );
+    height = frame.GetHeight( );
+    
+    pitches[ 0 ] = width * 2;
+    pitches[ 1 ] = 0;
+    pitches[ 2 ] = 0;
+    
+    output[ 0 ] = new uint8_t[ width * height ];
+    output[ 1 ] = new uint8_t[ width * height / 4 ];
+    output[ 2 ] = new uint8_t[ width * height / 4 ];
+    
+    // Define space for a uncompressed YUV422 PAL frame (being the maxiumum)
+    
+    input = new uint8_t[ 720 * 576 * 4 ];
+    
+    // Output the header
+    std::cout << "YUV4MPEG2 W" << width 
+             << " H" << height 
+             << " F" << ( height == 576 ? "25:1" : "30000:1001" ) 
+             << (height == 576 ? " Ib A59:54" : " Ib A10:11") 
+             << " XYSCSS=411"  // custom X-tag for chroma subsampling
+             << std::endl;
+    
+    return input != NULL;
+  }
+  
+  bool Output( Frame &frame )
+  {
+    Extract( frame );
+    std::cout << "FRAME" << std::endl;
+    int size = fwrite( output[0], width * height, 1, stdout );
+    fwrite( output[1], width * height / 4, 1, stdout );
+    fwrite( output[2], width * height / 4, 1, stdout );
+    return size != 0;
+  }
+  
+  bool Flush( )
+  {
+    delete output[ 0 ];
+    delete output[ 1 ];
+    delete output[ 2 ];
+    delete input;
+    return true;
+  }
+
+protected:
+  int width;
+  int height;
+  int pitches[3];
+  uint8_t *output[3];
+  uint8_t *input;
+  
+  virtual void Extract(Frame &frame)
+  {
+    frame.decoder->quality = DV_QUALITY_BEST;
+    frame.ExtractYUV( input );
+    
+    int w4 = width / 4;
+    uint8_t *y = output[0];
+    uint8_t *cb = output[1];
+    uint8_t *cr = output[2];
+    uint8_t *p = input;
+    
+    for (int i = 0; i < height; i++) {
+      /* process one scanline, 4 luma samples at a time:
+        use every luma sample, skip every other chroma sample */
+      for (int j = 0; j < w4; j++) {
+       /* packed YUV 422 is: Y[i] U[i] Y[i+1] V[i] */
+       *(y++) =  *(p++);
+       *(cb++) = *(p++);
+       *(y++) =  *(p++);
+       *(cr++) = *(p++);
+       
+       *(y++) =  *(p++);
+       (p++);  // skip this Cb sample
+       *(y++) =  *(p++);
+       (p++);  // skip this Cr sample
+      }
+    }
+  }
+};  // ExtendedYUV411Extractor
+
+
+
 /** Factory method to obtain the image extractor.
 */
 
@@ -184,11 +280,18 @@
 {
        YUV420Extractor *extractor = NULL;
 
-       if ( deinterlace_type == 0 )
-               extractor = new ExtendedYUV420Extractor( );
-       else
+       switch (deinterlace_type) {
+       case 1:
                extractor = new ExtendedYUV420CruftyExtractor( );
-
+               break;
+       case 2:
+               extractor = new ExtendedYUV411Extractor( );
+               break;
+       case 0:
+       default:
+               extractor = new ExtendedYUV420Extractor( );
+               break;
+       }
        return extractor;
 }
 
Index: apps/smil2yuv/smil2yuv.cc
===================================================================
RCS file: /cvsroot/kino/smilutils/apps/smil2yuv/smil2yuv.cc,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 smil2yuv.cc
--- apps/smil2yuv/smil2yuv.cc   11 Feb 2003 13:22:51 -0000      1.1.1.1
+++ apps/smil2yuv/smil2yuv.cc   13 Feb 2003 01:46:23 -0000
@@ -133,7 +133,8 @@
 {
        cerr << "Usage: smil2yuv [ -i type ] [ -a audio-file ] file [ file ... ]" << 
endl;
        cerr << "Where: file is smil, dv avi (1 or 2) or raw dv" << endl;
-       cerr << "       -i type   : 0 no deinterlacing, 1 bad deinterlacing (more to 
follow)" << endl;
+       cerr << "       -i type   : 0 no deinterlacing, 1 bad deinterlacing" << endl;
+       cerr << "                   2 experimental 4:1:1 subsampling (more to follow)" 
+<< endl;
        cerr << "       -a file   : mp2 or wav file to write to (more to be 
supported)" << endl;
        cerr << "       -o offset : frame offset (default: 0)" << endl;
        cerr << "       -f count  : frame count (default: all)" << endl;
Index: apps/smil2yuv/smil2yuv.1
===================================================================
RCS file: /cvsroot/kino/smilutils/apps/smil2yuv/smil2yuv.1,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 smil2yuv.1
--- apps/smil2yuv/smil2yuv.1    11 Feb 2003 13:22:51 -0000      1.1.1.1
+++ apps/smil2yuv/smil2yuv.1    13 Feb 2003 01:46:23 -0000
@@ -16,8 +16,10 @@
 over the mp2 file generated, export to a wav first and then convert the wav
 as required.
 .TP
-\fB\-d\fR \fItype\fR
-Deinterlacing type - 0 is none, 1 provides very poor deinterlacing (default: 0).
+\fB\-i\fR \fItype\fR
+Deinterlacing type - 0 is none, 1 provides very poor deinterlacing (default: 0).  
+2 results in no interlacing, but a 4:1:1 subsampled stream (native NTSC DV)
+which can be processed by y4mscaler.
 More types will be supported in the future.
 .TP
 \fB\-o\fR \fIoffset\fR


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Mjpeg-users mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/mjpeg-users

Reply via email to