added mpeg 1/2 postprocessing
authorarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>
Mon, 5 Mar 2001 23:02:30 +0000 (23:02 +0000)
committerarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>
Mon, 5 Mar 2001 23:02:30 +0000 (23:02 +0000)
git-svn-id: svn://git.mplayerhq.hu/mplayer/trunk@42 b3059339-0415-0410-9bf9-f77b7e298cf2

configure
libmpeg2/decode.c
libmpeg2/mpeg2_internal.h
libmpeg2/slice.c
mplayer.c

index 2522c0f..9e17c34 100755 (executable)
--- a/configure
+++ b/configure
@@ -683,6 +683,9 @@ $_xmmpaudio
 /* LIRC (remote control, see www.lirc.org) support: */
 $_lircdefs
 
+/* Define this to enable MPEG 1/2 image postprocessing (requires FAST cpu!) */
+#define MPEG12_POSTPROC
+
 /* Define if your processor stores words with the most significant
    byte first (like Motorola and SPARC, unlike Intel and VAX).  */
 /* #define WORDS_BIGENDIAN */
index 9426f4f..451050d 100644 (file)
@@ -51,7 +51,7 @@ mpeg2_config_t config;
 static int drop_flag = 0;
 static int drop_frame = 0;
 
-#ifdef POSTPROC
+#ifdef MPEG12_POSTPROC
 int quant_store[MBR+1][MBC+1]; // [Review]
 #endif
 
@@ -86,7 +86,7 @@ void mpeg2_init (void)
     motion_comp_init ();
 }
 
-static vo_frame_t frames[3];
+static vo_frame_t frames[4];
 
 void mpeg2_allocate_image_buffers (picture_t * picture)
 {
@@ -100,7 +100,11 @@ void mpeg2_allocate_image_buffers (picture_t * picture)
         buff_size = frame_size + (frame_size/4)*2; // 4Y + 1U + 1V
 
        // allocate images in YV12 format
+#ifdef MPEG12_POSTPROC
+       for(i=0;i<4;i++){
+#else
        for(i=0;i<3;i++){
+#endif
             base = shmem_alloc(buff_size);
            frames[i].base[0] = base;
            frames[i].base[1] = base + frame_size * 5 / 4;
@@ -114,13 +118,6 @@ void mpeg2_allocate_image_buffers (picture_t * picture)
        picture->backward_reference_frame=&frames[1];
        picture->current_frame=&frames[2];
 
-#ifdef POSTPROC
-        base = shmem_alloc(buff_size);
-       picture->pp_frame[0] = base;
-       picture->pp_frame[1] = base + frame_size * 5 / 4;
-       picture->pp_frame[2] = base + frame_size;
-#endif
-
 }
 
 static void copy_slice (vo_frame_t * frame, uint8_t ** src){
@@ -157,6 +154,23 @@ static int parse_chunk (vo_functions_t * output, int code, uint8_t * buffer)
        if (((picture->picture_structure == FRAME_PICTURE) ||
                 (picture->second_field))
            ) {
+#ifdef MPEG12_POSTPROC
+              if(picture->pp_options){
+                    // apply OpenDivX postprocess filter
+                   int stride[3];
+                   stride[0]=picture->coded_picture_width;
+                   stride[1]=stride[2]=stride[0]/2;
+                    postprocess((picture->picture_coding_type == B_TYPE) ?
+                           picture->current_frame->base :
+                           picture->forward_reference_frame->base,
+                       stride[0], frames[3].base, stride[0],
+                        picture->coded_picture_width, picture->coded_picture_height,
+                        &quant_store[1][1], (MBC+1), picture->pp_options);
+                   output->draw_slice (frames[3].base, stride, 
+                        picture->display_picture_width,
+                        picture->display_picture_height, 0, 0);
+              } else
+#endif
 #if 1
                if (picture->picture_coding_type != B_TYPE) {
                    int stride[3];
@@ -215,6 +229,10 @@ static int parse_chunk (vo_functions_t * output, int code, uint8_t * buffer)
            } else {
                if (picture->picture_coding_type == B_TYPE){
                    picture->current_frame = &frames[2];
+#ifdef MPEG12_POSTPROC
+                   if(picture->pp_options)
+                       picture->current_frame->copy=NULL; else
+#endif
                    picture->current_frame->copy=copy_slice;
                } else {
                    picture->current_frame = picture->forward_reference_frame;
index 046f371..ed278cc 100644 (file)
@@ -209,3 +209,9 @@ int slice_process (picture_t *picture, uint8_t code, uint8_t * buffer);
 
 /* stats.c */
 void stats_header (uint8_t code, uint8_t * buffer);
+
+#ifdef MPEG12_POSTPROC
+#define MBC 45
+#define MBR 36
+extern int quant_store[MBR+1][MBC+1]; // [Review]
+#endif
index 5c235d8..04728cd 100644 (file)
@@ -1488,7 +1488,7 @@ do {                                                                      \
            dest[1] += 4 * stride;                                      \
            dest[2] += 4 * stride;                                      \
        } while (0);                                                    \
-       offset = 0;                                                     \
+       offset = 0; ++code;                                             \
     }                                                                  \
 } while (0)
 
@@ -1739,6 +1739,9 @@ int slice_process (picture_t * picture, uint8_t code, uint8_t * buffer)
                picture->dc_dct_pred[2] = 1 << (picture->intra_dc_precision+7);
        }
 
+#ifdef MPEG12_POSTPROC
+       quant_store[code][(offset>>4)+1] = picture->quantizer_scale;
+#endif
        offset += 16;
        CHECK_DISPLAY;
 
@@ -1769,6 +1772,10 @@ int slice_process (picture_t * picture, uint8_t code, uint8_t * buffer)
                    else
                        MOTION (motion_fi_zero, MACROBLOCK_MOTION_FORWARD);
 
+#ifdef MPEG12_POSTPROC
+       quant_store[code][(offset>>4)+1] = picture->quantizer_scale;
+#endif
+
                    offset += 16;
                    CHECK_DISPLAY;
                } while (--mba_inc);
@@ -1781,6 +1788,10 @@ int slice_process (picture_t * picture, uint8_t code, uint8_t * buffer)
                    else
                        MOTION (motion_fi_reuse, macroblock_modes);
 
+#ifdef MPEG12_POSTPROC
+       quant_store[code][(offset>>4)+1] = picture->quantizer_scale;
+#endif
+
                    offset += 16;
                    CHECK_DISPLAY;
                } while (--mba_inc);
index 633e796..6654f13 100644 (file)
--- a/mplayer.c
+++ b/mplayer.c
@@ -337,7 +337,11 @@ int force_ni=0;
 
 for(i=1;i<argc;i++){
   if(strcmp(argv[i],"-o")==0){
-    printf("Option -o has been changed to -vo (video-out), use -vo !\n");
+    printf("Option -o has been renamed to -vo (video-out), use -vo !\n");
+    exit(1);
+  } else
+  if(strcmp(argv[i],"-divxq")==0){
+    printf("Option -divxq has been renamed to -pp (postprocessing), use -pp !\n");
     exit(1);
   } else
   if(strcmp(argv[i],"-vo")==0)  video_driver=argv[++i]; else
@@ -368,7 +372,7 @@ for(i=1;i<argc;i++){
   if(strcmp(argv[i],"-fps")==0) force_fps=strtod(argv[++i],NULL); else
   if(strcmp(argv[i],"-afm")==0) audio_format=strtol(argv[++i],NULL,0); else
   if(strcmp(argv[i],"-vcd")==0) vcd_track=strtol(argv[++i],NULL,0); else
-  if(strcmp(argv[i],"-divxq")==0) divx_quality=strtol(argv[++i],NULL,0); else
+  if(strcmp(argv[i],"-pp")==0) divx_quality=strtol(argv[++i],NULL,0); else
   if(strcmp(argv[i],"-br")==0) encode_bitrate=strtol(argv[++i],NULL,0); else
   if(strcmp(argv[i],"-x")==0) screen_size_x=strtol(argv[++i],NULL,0); else
   if(strcmp(argv[i],"-y")==0) screen_size_y=strtol(argv[++i],NULL,0); else
@@ -847,7 +851,15 @@ switch(has_video){
    if(!videobuffer){ printf("Cannot allocate shared memory\n");exit(0);}
    // init libmpeg2:
    mpeg2_init();
+#ifdef MPEG12_POSTPROC
    picture->pp_options=divx_quality;
+#else
+   if(divx_quality){
+       printf("WARNING! You requested image postprocessing for an MPEG 1/2 video,\n");
+       printf("         but compiled MPlayer without MPEG 1/2 postprocessing support!\n");
+       printf("         #define MPEG12_POSTPROC in config.h, and recompile libmpeg2!\n");
+   }
+#endif
    if(verbose)  printf("mpeg2_init() ok\n");
    // ========= Read & process sequence header & extension ============
    videobuf_len=0;