Do not #include libavutil/common.h. It is not used directly and mpbswap.h
[mplayer.git] / libmpcodecs / vd_ijpg.c
index 0a89500..a54b339 100644 (file)
@@ -1,6 +1,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "config.h"
 #include "mp_msg.h"
 
 #include <setjmp.h>
 
-#include "bswap.h"
-#include "postproc/rgb2rgb.h"
-#include "libvo/fastmemcpy.h"
+#include "mpbswap.h"
 
 #include "vd_internal.h"
 
 static vd_info_t info = {
        "JPEG Images decoder",
        "ijpg",
-       VFM_IJPG,
        "Pontscho",
        "based on vd_mpng.c",
-       "uses Indipended JPEG Group's jpeglib"
+       "uses Independent JPEG Group's jpeglib"
 };
 
 LIBVD_EXTERN(ijpg)
 
-static unsigned int out_fmt=0;
-
 static int last_w=-1;
 static int last_h=-1;
-static unsigned int last_c=-1;
+static int last_depth=-1;
 
 // to set/get/query special features/parameters
 static int control(sh_video_t *sh,int cmd,void* arg,...){
+    if (cmd == VDCTRL_QUERY_FORMAT) {
+        int format = *(int *)arg;
+        if ((last_depth == 24 && format == IMGFMT_RGB24) ||
+            (last_depth == 8  && format == IMGFMT_Y8   ))
+            return CONTROL_TRUE;
+        return CONTROL_FALSE;
+    }
     return CONTROL_UNKNOWN;
 }
 
@@ -66,16 +69,15 @@ METHODDEF(void) init_source (j_decompress_ptr cinfo)
 
 METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo)
 {
- my_src_ptr src = (my_src_ptr) cinfo->src;                                                         
- size_t nbytes;                                                                                    
+ my_src_ptr src = (my_src_ptr) cinfo->src;
  src->pub.next_input_byte = src->inbuf;
  src->pub.bytes_in_buffer = src->bufsize;
  return TRUE;
 }
-                                                                                                        
-METHODDEF(void) skip_input_data (j_decompress_ptr cinfo, long num_bytes)                           
-{                                                                                                  
- my_src_ptr src = (my_src_ptr) cinfo->src;                                                        
+
+METHODDEF(void) skip_input_data (j_decompress_ptr cinfo, long num_bytes)
+{
+ my_src_ptr src = (my_src_ptr) cinfo->src;
 
  if (num_bytes > 0)
   {
@@ -89,9 +91,9 @@ METHODDEF(void) skip_input_data (j_decompress_ptr cinfo, long num_bytes)
   }
 }
 
-METHODDEF(void) term_source (j_decompress_ptr cinfo) { }                                           
-                                                  
-GLOBAL(void) jpeg_buf_src ( j_decompress_ptr cinfo, char * inbuf,int bufsize )                     
+METHODDEF(void) term_source (j_decompress_ptr cinfo) { }
+
+GLOBAL(void) jpeg_buf_src ( j_decompress_ptr cinfo, char * inbuf,int bufsize )
 {
  my_src_ptr src;
  if (cinfo->src == NULL) cinfo->src=malloc( sizeof( my_source_mgr ) );
@@ -122,17 +124,17 @@ METHODDEF(void) my_error_exit (j_common_ptr cinfo)
  longjmp(myerr->setjmp_buffer, 1);
 }
 
-static struct     jpeg_decompress_struct cinfo;
-static struct     my_error_mgr jerr;
-static int        row_stride;
-                                 
 // decode a frame
 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
+ struct jpeg_decompress_struct cinfo;
+ struct my_error_mgr jerr;
  mp_image_t * mpi = NULL;
- int         width,height,depth,i,j;
+ int         width,height,depth,i;
 
  if ( len <= 0 ) return NULL; // skipped frame
 
+ memset(&cinfo, 0, sizeof(cinfo));
+ memset(&jerr, 0, sizeof(jerr));
  cinfo.err=jpeg_std_error( &jerr.pub );
  jerr.pub.error_exit=my_error_exit;
  if( setjmp( jerr.setjmp_buffer ) )
@@ -140,50 +142,39 @@ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
    mp_msg( MSGT_DECVIDEO,MSGL_ERR,"[ijpg] setjmp error ...\n" );
    return NULL;
   }
-  
+
  jpeg_create_decompress( &cinfo );
  jpeg_buf_src( &cinfo,data,len );
  jpeg_read_header( &cinfo,TRUE );
- width=cinfo.image_width;
- height=cinfo.image_height;
sh->disp_w=width=cinfo.image_width;
sh->disp_h=height=cinfo.image_height;
  jpeg_start_decompress( &cinfo );
  depth=cinfo.output_components * 8;
 
  switch( depth ) {
-   case 8:  out_fmt=IMGFMT_BGR8;  break;
-   case 24: out_fmt=IMGFMT_BGR24; break;
+   case 8:
+   case 24: break;
    default: mp_msg( MSGT_DECVIDEO,MSGL_ERR,"Sorry, unsupported JPEG colorspace: %d.\n",depth ); return NULL;
  }
 
- if ( last_w!=width || last_h!=height || last_c!=out_fmt )
+ if ( last_w!=width || last_h!=height || last_depth != depth )
   {
-   last_w=width; last_h=height; last_c=out_fmt;
-   if ( !out_fmt ) return NULL;
-   if(!mpcodecs_config_vo( sh,width,height,out_fmt )) return NULL;
+   last_depth = depth;
+   if(!mpcodecs_config_vo( sh,width,height, depth == 8 ? IMGFMT_Y8 : IMGFMT_RGB24 )) return NULL;
+   last_w=width; last_h=height;
   }
 
  mpi=mpcodecs_get_image( sh,MP_IMGTYPE_TEMP,MP_IMGFLAG_ACCEPT_STRIDE,width,height );
  if ( !mpi ) return NULL;
 
- row_stride=cinfo.output_width * cinfo.output_components;
-
  for ( i=0;i < height;i++ )
   {
-   char * row = mpi->planes[0] + mpi->stride[0] * i;
-   jpeg_read_scanlines( &cinfo,(JSAMPLE**)&row,1 );
-#warning workaround for rgb2bgr
-   if ( depth == 24 )
-    for ( j=0;j < width * 3;j+=3 )
-     {
-      char c;
-      c=row[j];
-      row[j]=row[j+2];
-      row[j+2]=c;
-     }
+   unsigned char * drow = mpi->planes[0] + mpi->stride[0] * i;
+   jpeg_read_scanlines( &cinfo,(JSAMPLE**)&drow,1 );
   }
-  
- jpeg_finish_decompress(&cinfo);                                                                   
- jpeg_destroy_decompress(&cinfo);                                                                  
-           
+
+ jpeg_finish_decompress(&cinfo);
+ jpeg_destroy_decompress(&cinfo);
+
  return mpi;
 }