annotate libmpcodecs/vd_ijpg.c @ 28883:c3f295ceae51

Do not call waveOutReset in uninit if you should wait till playing finishes, and retry waveOutClose if it fails due to still playing.
author reimar
date Mon, 09 Mar 2009 19:15:20 +0000
parents b21e1506e50b
children bbb6ebec87a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
1
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
2 #include <stdio.h>
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
3 #include <stdlib.h>
23305
22d3d12c6dfb Include string.h for memcpy, fastmemcpy.h alone is not enough.
reimar
parents: 21507
diff changeset
4 #include <string.h>
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
5
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
6 #include "config.h"
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
7 #include "mp_msg.h"
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
8
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
9 #include <jpeglib.h>
5048
2f53b53385e2 libjpeg and loader conflict workaround
pontscho
parents: 5042
diff changeset
10 #define UINT16 IJPG_UINT16
2f53b53385e2 libjpeg and loader conflict workaround
pontscho
parents: 5042
diff changeset
11 #define INT16 IJPG_INT16
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
12
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
13 #include <setjmp.h>
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
14
21507
fa99b3d31d13 Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents: 21372
diff changeset
15 #include "mpbswap.h"
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
16
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
17 #include "vd_internal.h"
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
18
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
19 static vd_info_t info = {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
20 "JPEG Images decoder",
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
21 "ijpg",
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
22 "Pontscho",
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
23 "based on vd_mpng.c",
18604
0b6b5f2f8c9a Spelling fix
pacman
parents: 18167
diff changeset
24 "uses Independent JPEG Group's jpeglib"
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
25 };
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
26
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
27 LIBVD_EXTERN(ijpg)
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
28
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
29 static int last_w=-1;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
30 static int last_h=-1;
25667
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
31 static int last_depth=-1;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
32
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
33 // to set/get/query special features/parameters
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
34 static int control(sh_video_t *sh,int cmd,void* arg,...){
25667
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
35 if (cmd == VDCTRL_QUERY_FORMAT) {
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
36 int format = *(int *)arg;
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
37 if ((last_depth == 24 && format == IMGFMT_RGB24) ||
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
38 (last_depth == 8 && format == IMGFMT_Y8 ))
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
39 return CONTROL_TRUE;
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
40 return CONTROL_FALSE;
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
41 }
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
42 return CONTROL_UNKNOWN;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
43 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
44
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
45 // init driver
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
46 static int init(sh_video_t *sh){
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
47 last_w=-1;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
48 return 1;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
49 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
50
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
51 // uninit driver
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
52 static void uninit(sh_video_t *sh){
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
53 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
54
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
55 //mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h);
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
56
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
57 typedef struct
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
58 {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
59 struct jpeg_source_mgr pub;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
60 unsigned char * inbuf;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
61 int bufsize;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
62 } my_source_mgr;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
63
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
64 typedef my_source_mgr * my_src_ptr;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
65
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
66 METHODDEF(void) init_source (j_decompress_ptr cinfo)
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
67 {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
68 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
69
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
70 METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo)
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
71 {
25666
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
72 my_src_ptr src = (my_src_ptr) cinfo->src;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
73 src->pub.next_input_byte = src->inbuf;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
74 src->pub.bytes_in_buffer = src->bufsize;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
75 return TRUE;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
76 }
25666
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
77
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
78 METHODDEF(void) skip_input_data (j_decompress_ptr cinfo, long num_bytes)
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
79 {
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
80 my_src_ptr src = (my_src_ptr) cinfo->src;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
81
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
82 if (num_bytes > 0)
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
83 {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
84 while (num_bytes > (long) src->pub.bytes_in_buffer)
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
85 {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
86 num_bytes -= (long) src->pub.bytes_in_buffer;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
87 (void) fill_input_buffer(cinfo);
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
88 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
89 src->pub.next_input_byte += (size_t) num_bytes;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
90 src->pub.bytes_in_buffer -= (size_t) num_bytes;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
91 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
92 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
93
25666
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
94 METHODDEF(void) term_source (j_decompress_ptr cinfo) { }
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
95
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
96 GLOBAL(void) jpeg_buf_src ( j_decompress_ptr cinfo, char * inbuf,int bufsize )
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
97 {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
98 my_src_ptr src;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
99 if (cinfo->src == NULL) cinfo->src=malloc( sizeof( my_source_mgr ) );
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
100 src = (my_src_ptr) cinfo->src;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
101 src->pub.init_source = init_source;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
102 src->pub.fill_input_buffer = fill_input_buffer;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
103 src->pub.skip_input_data = skip_input_data;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
104 src->pub.resync_to_restart = jpeg_resync_to_restart;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
105 src->pub.term_source = term_source;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
106 src->inbuf = inbuf;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
107 src->bufsize=bufsize;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
108 src->pub.bytes_in_buffer = 0;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
109 src->pub.next_input_byte = NULL;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
110 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
111
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
112 struct my_error_mgr
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
113 {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
114 struct jpeg_error_mgr pub;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
115 jmp_buf setjmp_buffer;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
116 };
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
117
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
118 typedef struct my_error_mgr * my_error_ptr;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
119
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
120 METHODDEF(void) my_error_exit (j_common_ptr cinfo)
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
121 {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
122 my_error_ptr myerr=(my_error_ptr) cinfo->err;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
123 (*cinfo->err->output_message) (cinfo);
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
124 longjmp(myerr->setjmp_buffer, 1);
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
125 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
126
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
127 // decode a frame
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
128 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
25664
a9e6d0744fc4 Avoid uselessly global variables
reimar
parents: 23375
diff changeset
129 struct jpeg_decompress_struct cinfo;
a9e6d0744fc4 Avoid uselessly global variables
reimar
parents: 23375
diff changeset
130 struct my_error_mgr jerr;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
131 mp_image_t * mpi = NULL;
6097
3e4936b52df4 rgb24, bgr 24/32 support even for grayscale
arpi
parents: 5366
diff changeset
132 int width,height,depth,i;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
133
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
134 if ( len <= 0 ) return NULL; // skipped frame
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
135
25664
a9e6d0744fc4 Avoid uselessly global variables
reimar
parents: 23375
diff changeset
136 memset(&cinfo, 0, sizeof(cinfo));
a9e6d0744fc4 Avoid uselessly global variables
reimar
parents: 23375
diff changeset
137 memset(&jerr, 0, sizeof(jerr));
5366
f46873b05f82 eeh 10l removed too much lines :(
atmos4
parents: 5365
diff changeset
138 cinfo.err=jpeg_std_error( &jerr.pub );
f46873b05f82 eeh 10l removed too much lines :(
atmos4
parents: 5365
diff changeset
139 jerr.pub.error_exit=my_error_exit;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
140 if( setjmp( jerr.setjmp_buffer ) )
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
141 {
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
142 mp_msg( MSGT_DECVIDEO,MSGL_ERR,"[ijpg] setjmp error ...\n" );
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
143 return NULL;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
144 }
25666
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
145
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
146 jpeg_create_decompress( &cinfo );
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
147 jpeg_buf_src( &cinfo,data,len );
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
148 jpeg_read_header( &cinfo,TRUE );
5365
b87743434e1f Issue a warning in VDec if disp_w and disp_h weren't set by codec and try workaround.
atmos4
parents: 5124
diff changeset
149 sh->disp_w=width=cinfo.image_width;
b87743434e1f Issue a warning in VDec if disp_w and disp_h weren't set by codec and try workaround.
atmos4
parents: 5124
diff changeset
150 sh->disp_h=height=cinfo.image_height;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
151 jpeg_start_decompress( &cinfo );
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
152 depth=cinfo.output_components * 8;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
153
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
154 switch( depth ) {
6097
3e4936b52df4 rgb24, bgr 24/32 support even for grayscale
arpi
parents: 5366
diff changeset
155 case 8:
3e4936b52df4 rgb24, bgr 24/32 support even for grayscale
arpi
parents: 5366
diff changeset
156 case 24: break;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
157 default: mp_msg( MSGT_DECVIDEO,MSGL_ERR,"Sorry, unsupported JPEG colorspace: %d.\n",depth ); return NULL;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
158 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
159
25667
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
160 if ( last_w!=width || last_h!=height || last_depth != depth )
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
161 {
25667
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
162 last_depth = depth;
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
163 if(!mpcodecs_config_vo( sh,width,height, depth == 8 ? IMGFMT_Y8 : IMGFMT_RGB24 )) return NULL;
6097
3e4936b52df4 rgb24, bgr 24/32 support even for grayscale
arpi
parents: 5366
diff changeset
164 last_w=width; last_h=height;
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
165 }
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
166
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
167 mpi=mpcodecs_get_image( sh,MP_IMGTYPE_TEMP,MP_IMGFLAG_ACCEPT_STRIDE,width,height );
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
168 if ( !mpi ) return NULL;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
169
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
170 for ( i=0;i < height;i++ )
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
171 {
6097
3e4936b52df4 rgb24, bgr 24/32 support even for grayscale
arpi
parents: 5366
diff changeset
172 unsigned char * drow = mpi->planes[0] + mpi->stride[0] * i;
25667
a9fd64f3d166 Colourspace conversions do _not_ belong into a decoder!
reimar
parents: 25666
diff changeset
173 jpeg_read_scanlines( &cinfo,(JSAMPLE**)&drow,1 );
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
174 }
25666
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
175
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
176 jpeg_finish_decompress(&cinfo);
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
177 jpeg_destroy_decompress(&cinfo);
79fee31fb216 Cosmetics: get rid of huge amounts of trailing whitespace
reimar
parents: 25665
diff changeset
178
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
179 return mpi;
ef8a43b74075 Add IJPG decoder.
pontscho
parents:
diff changeset
180 }