On Thu, 22 Jul 2004, Marc Gregoire wrote:

> I took another image of which I do have the original to work with.
> This picture can be found at the following links:
> Original: http://www.nuonsoft.com/temp/07_orig.jpg
> Scaled: http://www.nuonsoft.com/temp/07_scaled.jpg
> Mpeg2enc result: http://www.nuonsoft.com/temp/07_mpeg2enc.png
> Commercial result: http://www.nuonsoft.com/temp/07_commercial.png

        Thanks for making the data available - I pulled the images in and
        did a bit of experimenting tonight.   The results were even better
        than I expected!

> 1360x1020. The camera automatically saves them to a low (to avoid 
> graphical artifacts) compressed JPG.

> You clearly see that the 07_mpeg2enc.png shot is more blocky than the 
> 07_commercial.png. This is especially noticeable in the lower
> left corner of the image. You can see block in the marble. You also see 
> blocks in the orange wall in the back. These blocks are not visible in the 

        To my eyes the blocks are moderately hard to see - they're there 
        but on a TV I'm certain noone would be able to tell the two apart
        easily.

> took the jpeg2yuv of the mjpegtools 1.6.2 and that version does indeed have 
> the -R option, but like you said, this didn't fix the quality issue.
        
        You can also run the data thru "yuvcorrect -Y CONFORM" and it will
        adjust the data to be within the broadcast safe range.

        Now on to the evening's testing.   What I was curious about was if
        doing the scaling and color space conversion with 'y4mscaler' would
        make a difference (hopefully for the better ;)).

        So, I took the 07_orig.jpg file and converted it to 24bit RGB PPM
        and used 07_orig.ppm as the source.  'ppmtoy4m' was used to convert
        to 4:4:4 Y4M format (lossless - just going from RGB to YUV, still in
        24bit mode).   

        Then the key step: I used y4mscaler with an 8 tap Sinc/Lanczos scaling
        kernel _and_ converted to 420_mpeg2 *and* took into account the fact
        that PAL pixels are really 59:54 and not 1:1 (if you just scale from
        1360x1020 to 720x576 you're changing the aspect ratio when displayed
        on a TV!).

        The last step was to run the data thru the yuvcorrect program to get
        broadcast safe values.  The result of this could have been piped 
        directly into mpeg2enc but I created a .y4m file that I could use with
        other programs.

        Encoding was done with "-q 1" and a bitrate of 9800.  The resulting
        .m2v file was ~84K bytes ("84095 22 Jul 19:52 xxx.m2v")

        To view the results it's necessary to decode the .m2v file back to PPM.
        That is done using 'mpeg2dec' and a couple more of the mjpegtools 
        utilities (pgmtoy4m and y4mtoppm).  y4mscaler was used to convert 
        upsample to 4:4:4 (24bit mode).   pgmtoy4m is I believe only in the
        CVS version of mjpegtools at the moment but I might be mistaken about
        that (it's been eons since I've used anything except the CVS version ;))

        The script I used was this:

----------
#!/bin/sh

cat 07_orig.ppm | \
    ppmtoy4m -n 1 -F 25:1 -I p -S 444 | \
    y4mscaler -I sar=1:1 -O sar=PAL -O size=720x576 -O chromass=420_mpeg2 -S 
option=sinc:8 | \
    yuvcorrect -Y CONFORM > 07_orig.y4m

mpeg2enc -f 8 -b 9800 -q 1 -o xxx.m2v < 07_orig.y4m

mpeg2dec -o pgmpipe xxx.m2v |  \
    pgmtoy4m -a 59:54 -r 25:1 | \
    y4mscaler -O chromass=444 | \
    y4mtoppm -L > 0.ppm
----------

        I have attached a script of the session so that you can see the
        output of the tools.  The output from y4mscaler will be of interest I
        believe.

        Maybe I'm overdue for getting new glasses but to me the .m2v file 
        produced above looks sharper and clearer than either 07_commercial.png
        or 07_mpeg2enc.png.   The differences between the file produced above
        and the .png files are subtle to my eyes even at a 2x zoom in the
        GIMP (using Apple's 23" Cinema-HD LCD screen).  I'm sure that With a 
        higher bitrate the differences would be even smaller but the
        sharpness in the file created by the above script is noticeably
        better than the 07_commercial.png and 07_mpeg2enc.png - those almost 
        look "blurred" in comparison ;)

        Perhaps someone with better eyes (or newer glasses :)) can run some
        tests and chime in on this - another opinion would be welcome.

        Cheers,
        Steven Schultz
Script started on Thu Jul 22 19:52:03 2004
[LARRY:~/x] sms% ./x.sh
   INFO: [yuvcorrect] yuvcorrect 1.6.3 (16-11-2002) is a general image correction 
utility for yuv frames
   INFO: [yuvcorrect] (C) 2002 Xavier Biquard <[EMAIL PROTECTED]>, yuvcorrect -h for 
usage, or man yuvcorrect
   INFO: [ppmtoy4m] Command-line Parameters:
   INFO: [ppmtoy4m]              framerate:  25:1
   INFO: [ppmtoy4m]     pixel aspect ratio:  1:1
   INFO: [ppmtoy4m]              interlace:  none/progressive
   INFO: [ppmtoy4m]         starting frame:  0
   INFO: [ppmtoy4m]            # of frames:  1, or until input exhausted
   INFO: [ppmtoy4m]     chroma subsampling:  4:4:4 (no subsampling)
   INFO: [ppmtoy4m] Output Stream parameters:
   INFO: [ppmtoy4m]     frame size:  1360x1020 pixels (4161600 bytes)
   INFO: [ppmtoy4m]         chroma:  4:4:4 (no subsampling)
   INFO: [ppmtoy4m]     frame rate:  25/1 fps (~25.000000)
   INFO: [ppmtoy4m]      interlace:  none/progressive
   INFO: [ppmtoy4m]   sample aspect ratio:  1:1
   INFO: [y4mscaler] Input Stream Header:
   INFO: [y4mscaler] <<<   frame size:  1360x1020 pixels (4161600 bytes)
   INFO: [y4mscaler] <<<       chroma:  4:4:4 (no subsampling)
   INFO: [y4mscaler] <<<   frame rate:  25/1 fps (~25.000000)
   INFO: [y4mscaler] <<<    interlace:  none/progressive
   INFO: [y4mscaler] <<< sample aspect ratio:  1:1
   INFO: [y4mscaler] Source matte region defaulting to full source frame.
   INFO: [y4mscaler] Source active region defaulting to full source frame.
   INFO: [y4mscaler] Target interlacing defaulting to match source.
   INFO: [y4mscaler] Target active region defaulting to full target frame.
   INFO: [y4mscaler] Deriving ratios from active regions and SARs...
   INFO: [y4mscaler] ...using scaling ratios which pad target.
   INFO: [y4mscaler] ...using scaling ratios which are simple.
++ WARN: [y4mscaler] Target active region clipped by projection of source.
   INFO: [y4mscaler] === SOURCE parameters: =================
   INFO: [y4mscaler] < stream:
   INFO: [y4mscaler] <   1360x1020, SAR 1:1, progressive
   INFO: [y4mscaler] <   chroma subsampling:  444
   INFO: [y4mscaler] <   chroma ss ratios:  x 1:1  y 1:1
   INFO: [y4mscaler] < active region:
   INFO: [y4mscaler] <   1360.000000x1017.659134 at 0.000000,1.222222
   INFO: [y4mscaler] < matte region:
   INFO: [y4mscaler] <   1360x1020 at 0,0  (bg Y'CbCr: 16,128,128)
   INFO: [y4mscaler] === SCALING parameters: ================
   INFO: [y4mscaler] | Scaler:  Matto's Generic Scaler
   INFO: [y4mscaler] |          kernels:  sinc:8, sinc:8
   INFO: [y4mscaler] === TARGET parameters: =================
   INFO: [y4mscaler] > stream:
   INFO: [y4mscaler] >   720x576, SAR 59:54, progressive
   INFO: [y4mscaler] <   chroma subsampling:  420_MPEG2
   INFO: [y4mscaler] <   chroma ss ratios:  x 1:2  y 1:2
   INFO: [y4mscaler] > active region:
   INFO: [y4mscaler] >   680x556 at 20,10  (bg Y'CbCr: 16,128,128)
   INFO: [y4mscaler] > X ratio:  1/2
   INFO: [y4mscaler] > Y ratio:  59/108
   INFO: [y4mscaler] Output Stream Header:
   INFO: [y4mscaler] >>>   frame size:  720x576 pixels (622080 bytes)
   INFO: [y4mscaler] >>>       chroma:  4:2:0 MPEG-2 (horiz. cositing)
   INFO: [y4mscaler] >>>   frame rate:  25/1 fps (~25.000000)
   INFO: [y4mscaler] >>>    interlace:  none/progressive
   INFO: [y4mscaler] >>> sample aspect ratio:  59:54
   INFO: [yuvcorrect] input:   frame size:  720x576 pixels (622080 bytes)
   INFO: [yuvcorrect] input:       chroma:  4:2:0 MPEG-2 (horiz. cositing)
   INFO: [yuvcorrect] input:   frame rate:  25/1 fps (~25.000000)
   INFO: [yuvcorrect] input:    interlace:  none/progressive
   INFO: [yuvcorrect] input: sample aspect ratio:  59:54
   INFO: [yuvcorrect] no line switching
   INFO: [yuvcorrect] no time forwarding
   INFO: [yuvcorrect] With luminance correction
   INFO: [yuvcorrect] With chrominance correction
   INFO: [yuvcorrect] Without rgb correction
   INFO: [y4mscaler] Frame number 0
   INFO: [y4mscaler] Frame number 1
   INFO: [y4mscaler] End of stream at frame 1.
   INFO: [yuvcorrect] Frame number 0
   INFO: [yuvcorrect] End of stream!
   INFO: [yuvcorrect] Normal exit: end of stream with frame number 1!
   INFO: [mpeg2enc] SETTING AltiVec for MOTION!
   INFO: [mpeg2enc] SETTING AltiVec for TRANSFORM!
   INFO: [mpeg2enc] SETTING AltiVec for PREDICTION!
   INFO: [mpeg2enc] Selecting DVD output profile
   INFO: [mpeg2enc] Assuming norm PAL
   INFO: [mpeg2enc] Progressive input - selecting progressive encoding.
   INFO: [mpeg2enc] Encoding MPEG-2 video to xxx.m2v
   INFO: [mpeg2enc] Horizontal size: 720 pel
   INFO: [mpeg2enc] Vertical size: 576 pel
   INFO: [mpeg2enc] Aspect ratio code: 2 = 4:3 display
   INFO: [mpeg2enc] Frame rate code:   3 = 25.0 (PAL/SECAM VIDEO / converted FILM)
   INFO: [mpeg2enc] Bitrate: 9800 KBit/s
   INFO: [mpeg2enc] Quality factor: 1 (Quantisation = 1) (1=best, 31=worst)
   INFO: [mpeg2enc] Field order for input: none/progressive
   INFO: [mpeg2enc] Sequence unlimited length
   INFO: [mpeg2enc] Search radius: 16
   INFO: [mpeg2enc] GOP SIZE RANGE 9 TO 15 
   INFO: [mpeg2enc] Setting colour/gamma parameters to "PAL B/G"
   INFO: [mpeg2enc] Progressive format frames = 1
   INFO: [mpeg2enc] Using default unmodified quantization matrices
   INFO: [mpeg2enc] Buffering 33 frames
   INFO: [mpeg2enc] Signaling last frame = 0
   INFO: [mpeg2enc] SETTING AltiVec for QUANTIZER!
   INFO: [mpeg2enc] GOP start (1 frames)
   INFO: [mpeg2enc] Frame end 0 I quant=9.04 total act=242.72241    
   INFO: [mpeg2enc] GOP start (0 frames)
   INFO: [mpeg2enc] Guesstimated final muxed size = 84095

mpeg2dec-0.4.1-cvs - by Michel Lespinasse <[EMAIL PROTECTED]> and Aaron Holtzman
   INFO: [pgmtoy4m] P5 cols: 720 rows: 864 maxval: 255
   INFO: [y4mscaler] Input Stream Header:
   INFO: [y4mscaler] <<<   frame size:  720x576 pixels (622080 bytes)
   INFO: [y4mscaler] <<<       chroma:  4:2:0 MPEG-2 (horiz. cositing)
   INFO: [y4mscaler] <<<   frame rate:  25/1 fps (~25.000000)
   INFO: [y4mscaler] <<<    interlace:  top-field-first
   INFO: [y4mscaler] <<< sample aspect ratio:  59:54
   INFO: [y4mscaler] Source matte region defaulting to full source frame.
   INFO: [y4mscaler] Source active region defaulting to full source frame.
   INFO: [y4mscaler] Target interlacing defaulting to match source.
   INFO: [y4mscaler] Target frame size defaulting to match source.
   INFO: [y4mscaler] Target active region defaulting to full target frame.
   INFO: [y4mscaler] Deriving ratios from active regions...
   INFO: [y4mscaler] === SOURCE parameters: =================
   INFO: [y4mscaler] < stream:
   INFO: [y4mscaler] <   720x576, SAR 59:54, top-field-first
   INFO: [y4mscaler] <   chroma subsampling:  420_MPEG2
   INFO: [y4mscaler] <   chroma ss ratios:  x 1:2  y 1:2
   INFO: [y4mscaler] < active region:
   INFO: [y4mscaler] <   720.000000x576.000000 at 0.000000,0.000000
   INFO: [y4mscaler] < matte region:
   INFO: [y4mscaler] <   720x576 at 0,0  (bg Y'CbCr: 16,128,128)
   INFO: [y4mscaler] === SCALING parameters: ================
   INFO: [y4mscaler] | Scaler:  Matto's Generic Scaler
   INFO: [y4mscaler] |          kernels:  linear, linear
   INFO: [y4mscaler] === TARGET parameters: =================
   INFO: [y4mscaler] > stream:
   INFO: [y4mscaler] >   720x576, SAR 59:54, top-field-first
   INFO: [y4mscaler] <   chroma subsampling:  444
   INFO: [y4mscaler] <   chroma ss ratios:  x 1:1  y 1:1
   INFO: [y4mscaler] > active region:
   INFO: [y4mscaler] >   720x576 at 0,0  (bg Y'CbCr: 16,128,128)
   INFO: [y4mscaler] > X ratio:  1/1
   INFO: [y4mscaler] > Y ratio:  1/1
   INFO: [y4mscaler] Output Stream Header:
   INFO: [y4mscaler] >>>   frame size:  720x576 pixels (1244160 bytes)
   INFO: [y4mscaler] >>>       chroma:    INFO: [y4mtoppm] input stream parameters:
   INFO: [y4mtoppm] <<<  frame size:  720x576 pixels (1244160 bytes)
   INFO: [y4mtoppm] <<<      chroma:  4:4:4 (no subsampling)
   INFO: [y4mtoppm] <<<  frame rate:  25/1 fps (~25.000000)
   INFO: [y4mtoppm] <<<   interlace:  top-field-first
   INFO: [y4mtoppm] <<<sample aspect ratio:  59:54
 4:4:4 (no subsampling)
   INFO: [y4mscaler] >>>   frame rate:  25/1 fps (~25.000000)
   INFO: [y4mscaler] >>>    interlace:  top-field-first
   INFO: [y4mscaler] >>> sample aspect ratio:  59:54
   INFO: [y4mscaler] Frame number 0

1 frames decoded in 0.00 seconds (0.00 fps)
   INFO: [y4mscaler] Frame number 1
   INFO: [y4mscaler] End of stream at frame 1.
[LARRY:~/x] sms% exit

Script done on Thu Jul 22 19:52:10 2004

Reply via email to