annotate TOOLS/mwallp/jpeg.c @ 22449:08774fd8fd17

Implement percent-based seeking
author reimar
date Mon, 05 Mar 2007 13:27:42 +0000
parents 6bd869a18d2c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6457
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
1 // based on vd_ijpg.c by Pontscho
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
2
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
3 #include <stdio.h>
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
4 #include <stdlib.h>
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
5
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
6 #include <jpeglib.h>
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
7 #define UINT16 IJPG_UINT16
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
8 #define INT16 IJPG_INT16
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
9
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
10 #include <setjmp.h>
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
11
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
12 #include <inttypes.h>
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
13
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
14 #include "img_format.h"
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
15
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
16 #include "swscale.h"
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
17 #include "rgb2rgb.h"
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
18
9500
4930b82dbf02 forgot ...
michael
parents: 6457
diff changeset
19 static struct SwsContext *swsContext=NULL;
6457
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
20
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
21 typedef struct
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
22 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
23 struct jpeg_source_mgr pub;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
24 unsigned char * inbuf;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
25 int bufsize;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
26 } my_source_mgr;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
27
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
28 typedef my_source_mgr * my_src_ptr;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
29
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
30 METHODDEF(void) init_source (j_decompress_ptr cinfo)
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
31 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
32 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
33
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
34 METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo)
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
35 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
36 my_src_ptr src = (my_src_ptr) cinfo->src;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
37 size_t nbytes;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
38 src->pub.next_input_byte = src->inbuf;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
39 src->pub.bytes_in_buffer = src->bufsize;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
40 return TRUE;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
41 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
42
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
43 METHODDEF(void) skip_input_data (j_decompress_ptr cinfo, long num_bytes)
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
44 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
45 my_src_ptr src = (my_src_ptr) cinfo->src;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
46
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
47 if (num_bytes > 0)
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
48 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
49 while (num_bytes > (long) src->pub.bytes_in_buffer)
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
50 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
51 num_bytes -= (long) src->pub.bytes_in_buffer;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
52 (void) fill_input_buffer(cinfo);
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
53 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
54 src->pub.next_input_byte += (size_t) num_bytes;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
55 src->pub.bytes_in_buffer -= (size_t) num_bytes;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
56 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
57 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
58
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
59 METHODDEF(void) term_source (j_decompress_ptr cinfo) { }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
60
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
61 GLOBAL(void) jpeg_buf_src ( j_decompress_ptr cinfo, char * inbuf,int bufsize )
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
62 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
63 my_src_ptr src;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
64 if (cinfo->src == NULL) cinfo->src=malloc( sizeof( my_source_mgr ) );
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
65 src = (my_src_ptr) cinfo->src;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
66 src->pub.init_source = init_source;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
67 src->pub.fill_input_buffer = fill_input_buffer;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
68 src->pub.skip_input_data = skip_input_data;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
69 src->pub.resync_to_restart = jpeg_resync_to_restart;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
70 src->pub.term_source = term_source;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
71 src->inbuf = inbuf;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
72 src->bufsize=bufsize;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
73 src->pub.bytes_in_buffer = 0;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
74 src->pub.next_input_byte = NULL;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
75 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
76
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
77 struct my_error_mgr
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
78 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
79 struct jpeg_error_mgr pub;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
80 jmp_buf setjmp_buffer;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
81 };
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
82
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
83 typedef struct my_error_mgr * my_error_ptr;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
84
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
85 METHODDEF(void) my_error_exit (j_common_ptr cinfo)
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
86 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
87 my_error_ptr myerr=(my_error_ptr) cinfo->err;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
88 (*cinfo->err->output_message) (cinfo);
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
89 longjmp(myerr->setjmp_buffer, 1);
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
90 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
91
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
92 static struct jpeg_decompress_struct cinfo;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
93 static struct my_error_mgr jerr;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
94
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
95 // decode a frame
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
96 int decode_jpeg(void* data,int len,char* dbuffer,int dwidth,int dheight, int dstride,int dbpp){
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
97 int width,height,depth,i;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
98 int row_stride;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
99 unsigned char* img=NULL;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
100 int in_fmt=0;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
101
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
102 if ( len <= 0 ) return 0; // skipped frame
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
103
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
104 cinfo.err=jpeg_std_error( &jerr.pub );
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
105 jerr.pub.error_exit=my_error_exit;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
106 if( setjmp( jerr.setjmp_buffer ) )
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
107 {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
108 return 0;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
109 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
110
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
111 jpeg_create_decompress( &cinfo );
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
112 jpeg_buf_src( &cinfo,data,len );
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
113 jpeg_read_header( &cinfo,TRUE );
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
114 width=cinfo.image_width;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
115 height=cinfo.image_height;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
116 jpeg_start_decompress( &cinfo );
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
117 depth=cinfo.output_components * 8;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
118
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
119 switch( depth ) {
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
120 case 8: in_fmt=IMGFMT_Y8;break;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
121 case 24: in_fmt=IMGFMT_RGB|24;break;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
122 default: return 0;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
123 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
124
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
125 row_stride=cinfo.output_width * cinfo.output_components;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
126 img=malloc(row_stride * (height+1));
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
127
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
128 for ( i=0;i < height;i++ ){
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
129 // char* row=dbuffer+i*dstride;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
130 char* row=img+row_stride*i;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
131 jpeg_read_scanlines( &cinfo,(JSAMPLE**)&row,1 );
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
132 }
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
133
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
134 jpeg_finish_decompress(&cinfo);
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
135 jpeg_destroy_decompress(&cinfo);
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
136
10001
michael
parents: 9500
diff changeset
137 swsContext= sws_getContext(width,height, in_fmt,
13373
6bd869a18d2c passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents: 10001
diff changeset
138 dwidth,dheight, IMGFMT_BGR|dbpp, SWS_BICUBIC, NULL, NULL, NULL);
6457
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
139
9500
4930b82dbf02 forgot ...
michael
parents: 6457
diff changeset
140 sws_scale(swsContext,&img,&row_stride,0,height,&dbuffer, &dstride);
6457
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
141
9500
4930b82dbf02 forgot ...
michael
parents: 6457
diff changeset
142 sws_freeContext(swsContext);
6457
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
143
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
144 free(img);
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
145
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
146 return 1;
95918d5066b6 mwallp - simple wallpaper setting tool using MPlayer codebase
arpi
parents:
diff changeset
147 }