Mercurial > mplayer.hg
annotate libmpcodecs/ve_vfw.c @ 24131:30028bbcb9e8
Use a single select() for both key and slave input
Previous code used two separate select() calls one after another, so
that whenever it was running select() on one set of fds events in the
other set would go unnoticed until later. Now there's a single select()
which allows reacting immediately to any input source.
The behavior of the new code differs somewhat from the old; for example
multiple fds that stay readable are no longer handled in a round-robin
fashion and the total amount the process sleeps can differ. Some tuning
might be required later.
author | uau |
---|---|
date | Sat, 25 Aug 2007 04:28:11 +0000 |
parents | d07cc034ed66 |
children | 6a8be4b73d07 |
rev | line source |
---|---|
5550 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
7238 | 4 #include <unistd.h> |
8585 | 5 #include <inttypes.h> |
22252
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
6 #include <sys/stat.h> |
5550 | 7 |
17012 | 8 #include "config.h" |
5550 | 9 |
17012 | 10 #include "mp_msg.h" |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
11 #include "help_mp.h" |
5550 | 12 |
13 #include "codec-cfg.h" | |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
22577
diff
changeset
|
14 //#include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
15 //#include "libmpdemux/demuxer.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
16 //#include "libmpdemux/stheader.h" |
7231 | 17 |
22577
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
22252
diff
changeset
|
18 #include "loader/loader.h" |
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
22252
diff
changeset
|
19 //#include "loader/wine/mmreg.h" |
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
22252
diff
changeset
|
20 #include "loader/wine/vfw.h" |
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
22252
diff
changeset
|
21 #include "loader/wine/avifmt.h" |
5550 | 22 |
5607 | 23 #include "img_format.h" |
24 #include "mp_image.h" | |
5550 | 25 #include "vf.h" |
26 | |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
22577
diff
changeset
|
27 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
28 #include "libmpdemux/muxer.h" |
8585 | 29 |
5550 | 30 //===========================================================================// |
31 | |
6083 | 32 static char *vfw_param_codec = NULL; |
22252
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
33 static char *vfw_param_compdata = NULL; |
6083 | 34 |
10594
57bdcdb061d7
Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents:
9014
diff
changeset
|
35 #include "m_option.h" |
6083 | 36 |
10594
57bdcdb061d7
Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents:
9014
diff
changeset
|
37 m_option_t vfwopts_conf[]={ |
6083 | 38 {"codec", &vfw_param_codec, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
22252
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
39 {"compdata", &vfw_param_compdata, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
6083 | 40 {NULL, NULL, 0, 0, 0, 0, NULL} |
41 }; | |
42 | |
5550 | 43 struct vf_priv_s { |
8585 | 44 muxer_stream_t* mux; |
5550 | 45 BITMAPINFOHEADER* bih; |
46 }; | |
47 | |
7557 | 48 static HIC encoder_hic; |
7231 | 49 static void* encoder_buf=NULL; |
50 static int encoder_buf_size=0; | |
51 static int encoder_frameno=0; | |
52 | |
53 //int init_vfw_encoder(char *dll_name, BITMAPINFOHEADER *input_bih, BITMAPINFOHEADER *output_bih) | |
22252
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
54 static BITMAPINFOHEADER* vfw_open_encoder(char *dll_name, char *compdatafile, BITMAPINFOHEADER *input_bih,unsigned int out_fourcc) |
7231 | 55 { |
56 HRESULT ret; | |
57 BITMAPINFOHEADER* output_bih=NULL; | |
58 int temp_len; | |
22252
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
59 FILE *fd=NULL; |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
60 char *drvdata=NULL; |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
61 struct stat st; |
7231 | 62 |
63 //sh_video = malloc(sizeof(sh_video_t)); | |
64 | |
65 mp_msg(MSGT_WIN32,MSGL_V,"======= Win32 (VFW) VIDEO Encoder init =======\n"); | |
66 | |
67 // memset(&sh_video->o_bih, 0, sizeof(BITMAPINFOHEADER)); | |
68 // output_bih->biSize = sizeof(BITMAPINFOHEADER); | |
69 | |
7390 | 70 // encoder_hic = ICOpen( 0x63646976, out_fourcc, ICMODE_COMPRESS); |
7557 | 71 encoder_hic = ICOpen( (long) dll_name, out_fourcc, ICMODE_COMPRESS); |
7231 | 72 if(!encoder_hic){ |
73 mp_msg(MSGT_WIN32,MSGL_ERR,"ICOpen failed! unknown codec / wrong parameters?\n"); | |
74 return NULL; | |
75 } | |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
76 mp_msg(MSGT_WIN32,MSGL_INFO,"HIC: %x\n", encoder_hic); |
7231 | 77 |
78 #if 1 | |
79 { | |
80 ICINFO icinfo; | |
81 | |
82 ret = ICGetInfo(encoder_hic, &icinfo, sizeof(ICINFO)); | |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
83 mp_msg(MSGT_WIN32,MSGL_INFO,"%ld - %ld - %d\n", ret, icinfo.dwSize, sizeof(ICINFO)); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
84 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_CompressorType, icinfo.fccType); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
85 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_CompressorSubtype, icinfo.fccHandler); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
86 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_CompressorFlags, |
7231 | 87 icinfo.dwFlags, icinfo.dwVersion, icinfo.dwVersionICM); |
88 //printf("Compressor name: %s\n", icinfo.szName); | |
89 //printf("Compressor description: %s\n", icinfo.szDescription); | |
90 | |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
91 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_Flags); |
7231 | 92 if (icinfo.dwFlags & VIDCF_QUALITY) |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
93 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_Quality); |
7231 | 94 if (icinfo.dwFlags & VIDCF_FASTTEMPORALD) |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
95 mp_msg(MSGT_WIN32,MSGL_INFO," fast-decompr"); |
7231 | 96 if (icinfo.dwFlags & VIDCF_QUALITYTIME) |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
97 mp_msg(MSGT_WIN32,MSGL_INFO," temp-quality"); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
98 mp_msg(MSGT_WIN32,MSGL_INFO,"\n"); |
7231 | 99 } |
100 #endif | |
101 | |
22252
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
102 if(compdatafile){ |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
103 if (!strncmp(compdatafile, "dialog", 6)){ |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
104 if (ICSendMessage(encoder_hic, ICM_CONFIGURE, -1, 0) != ICERR_OK){ |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
105 mp_msg(MSGT_WIN32,MSGL_ERR,"Compressor doesn't have a configure dialog!\n"); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
106 return NULL; |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
107 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
108 if (ICSendMessage(encoder_hic, ICM_CONFIGURE, 0, 0) != ICERR_OK){ |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
109 mp_msg(MSGT_WIN32,MSGL_ERR,"Compressor configure dialog failed!\n"); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
110 return NULL; |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
111 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
112 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
113 else { |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
114 if (stat(compdatafile, &st) < 0){ |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
115 mp_msg(MSGT_WIN32,MSGL_ERR,"Compressor data file not found!\n"); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
116 return NULL; |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
117 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
118 fd = fopen(compdatafile, "rb"); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
119 if (!fd){ |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
120 mp_msg(MSGT_WIN32,MSGL_ERR,"Cannot open Compressor data file!\n"); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
121 return NULL; |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
122 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
123 drvdata = (char *) malloc(st.st_size); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
124 if (fread(drvdata, st.st_size, 1, fd) != 1) { |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
125 mp_msg(MSGT_WIN32,MSGL_ERR,"Cannot read Compressor data file!\n"); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
126 fclose(fd); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
127 free(drvdata); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
128 return NULL; |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
129 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
130 fclose(fd); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
131 mp_msg(MSGT_WIN32,MSGL_ERR,"Compressor data %d bytes\n", st.st_size); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
132 if (!(temp_len = (unsigned int) ICSendMessage(encoder_hic, ICM_SETSTATE, (LPARAM) drvdata, (int) st.st_size))){ |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
133 mp_msg(MSGT_WIN32,MSGL_ERR,"ICSetState failed!\n"); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
134 free(drvdata); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
135 return NULL; |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
136 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
137 free(drvdata); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
138 mp_msg(MSGT_WIN32,MSGL_INFO,"ICSetState ret: %d\n", temp_len); |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
139 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
140 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
141 |
7231 | 142 temp_len = ICCompressGetFormatSize(encoder_hic, input_bih); |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
143 mp_msg(MSGT_WIN32,MSGL_INFO,"ICCompressGetFormatSize ret: %d\n", temp_len); |
7231 | 144 |
145 if (temp_len < sizeof(BITMAPINFOHEADER)) temp_len=sizeof(BITMAPINFOHEADER); | |
146 | |
147 output_bih = malloc(temp_len+4); | |
148 memset(output_bih,0,temp_len); | |
149 output_bih->biSize = temp_len; //sizeof(BITMAPINFOHEADER); | |
150 | |
151 return output_bih; | |
152 } | |
153 | |
154 static int vfw_start_encoder(BITMAPINFOHEADER *input_bih, BITMAPINFOHEADER *output_bih){ | |
155 HRESULT ret; | |
156 int temp_len=output_bih->biSize; | |
157 int i; | |
158 | |
159 ret = ICCompressGetFormat(encoder_hic, input_bih, output_bih); | |
160 if(ret < 0){ | |
161 unsigned char* temp=(unsigned char*)output_bih; | |
162 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressGetFormat failed: Error %d (0x%X)\n", (int)ret, (int)ret); | |
163 for (i=0; i < temp_len; i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02x ", temp[i]); | |
164 return 0; | |
165 } | |
166 mp_msg(MSGT_WIN32,MSGL_V,"ICCompressGetFormat OK\n"); | |
167 | |
168 if (temp_len > sizeof(BITMAPINFOHEADER)) | |
169 { | |
170 unsigned char* temp=(unsigned char*)output_bih; | |
171 mp_msg(MSGT_WIN32, MSGL_V, "Extra info in o_bih (%d bytes)!\n", | |
172 temp_len-sizeof(BITMAPINFOHEADER)); | |
173 for(i=sizeof(output_bih);i<temp_len;i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02X ",temp[i]); | |
174 } | |
175 | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
17906
diff
changeset
|
176 // if( mp_msg_test(MSGT_WIN32,MSGL_V) ) { |
7231 | 177 printf("Starting compression:\n"); |
178 printf(" Input format:\n"); | |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
179 printf(" biSize %d\n", input_bih->biSize); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
180 printf(" biWidth %d\n", input_bih->biWidth); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
181 printf(" biHeight %d\n", input_bih->biHeight); |
7231 | 182 printf(" biPlanes %d\n", input_bih->biPlanes); |
183 printf(" biBitCount %d\n", input_bih->biBitCount); | |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
184 printf(" biCompression 0x%x ('%.4s')\n", input_bih->biCompression, (char *)&input_bih->biCompression); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
185 printf(" biSizeImage %d\n", input_bih->biSizeImage); |
7231 | 186 printf(" Output format:\n"); |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
187 printf(" biSize %d\n", output_bih->biSize); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
188 printf(" biWidth %d\n", output_bih->biWidth); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
189 printf(" biHeight %d\n", output_bih->biHeight); |
7231 | 190 printf(" biPlanes %d\n", output_bih->biPlanes); |
191 printf(" biBitCount %d\n", output_bih->biBitCount); | |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
192 printf(" biCompression 0x%x ('%.4s')\n", output_bih->biCompression, (char *)&output_bih->biCompression); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7557
diff
changeset
|
193 printf(" biSizeImage %d\n", output_bih->biSizeImage); |
7231 | 194 // } |
195 | |
196 output_bih->biWidth=input_bih->biWidth; | |
197 output_bih->biHeight=input_bih->biHeight; | |
198 | |
199 ret = ICCompressQuery(encoder_hic, input_bih, output_bih); | |
200 if(ret){ | |
201 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressQuery failed: Error %d\n", (int)ret); | |
202 return 0; | |
203 } else | |
204 mp_msg(MSGT_WIN32,MSGL_V,"ICCompressQuery OK\n"); | |
205 | |
206 ret = ICCompressBegin(encoder_hic, input_bih, output_bih); | |
207 if(ret){ | |
208 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressBegin failed: Error %d\n", (int)ret); | |
209 // return 0; | |
210 } else | |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
211 mp_msg(MSGT_WIN32,MSGL_V,"ICCompressBegin OK\n"); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
212 mp_msg(MSGT_WIN32,MSGL_INFO," Output format after query/begin:\n"); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
213 mp_msg(MSGT_WIN32,MSGL_INFO," biSize %d\n", output_bih->biSize); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
214 mp_msg(MSGT_WIN32,MSGL_INFO," biWidth %d\n", output_bih->biWidth); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
215 mp_msg(MSGT_WIN32,MSGL_INFO," biHeight %d\n", output_bih->biHeight); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
216 mp_msg(MSGT_WIN32,MSGL_INFO," biPlanes %d\n", output_bih->biPlanes); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
217 mp_msg(MSGT_WIN32,MSGL_INFO," biBitCount %d\n", output_bih->biBitCount); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
218 mp_msg(MSGT_WIN32,MSGL_INFO," biCompression 0x%x ('%.4s')\n", output_bih->biCompression, (char *)&output_bih->biCompression); |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
219 mp_msg(MSGT_WIN32,MSGL_INFO," biSizeImage %d\n", output_bih->biSizeImage); |
7231 | 220 |
221 encoder_buf_size=input_bih->biSizeImage; | |
222 encoder_buf=malloc(encoder_buf_size); | |
223 encoder_frameno=0; | |
224 | |
225 mp_msg(MSGT_WIN32,MSGL_V,"VIDEO CODEC Init OK!!! ;-)\n"); | |
226 return 1; | |
227 } | |
228 | |
229 static int vfw_encode_frame(BITMAPINFOHEADER* biOutput,void* OutBuf, | |
230 BITMAPINFOHEADER* biInput,void* Image, | |
231 long* keyframe, int quality){ | |
232 HRESULT ret; | |
233 | |
234 //long VFWAPIV ICCompress( | |
235 // HIC hic,long dwFlags,LPBITMAPINFOHEADER lpbiOutput,void* lpOutputBuf, | |
236 // LPBITMAPINFOHEADER lpbiInput,void* lpImage,long* lpckid, | |
237 // long* lpdwFlags,long lFrameNum,long dwFrameSize,long dwQuality, | |
238 // LPBITMAPINFOHEADER lpbiInputPrev,void* lpImagePrev | |
239 //); | |
240 | |
241 // printf("vfw_encode_frame(%p,%p, %p,%p, %p,%d)\n",biOutput,OutBuf,biInput,Image,keyframe,quality); | |
242 | |
243 ret=ICCompress(encoder_hic, 0, | |
244 biOutput, OutBuf, | |
245 biInput, Image, | |
246 NULL, keyframe, encoder_frameno, 0, quality, | |
247 biInput, encoder_buf); | |
248 | |
249 // printf("ok. size=%d\n",biOutput->biSizeImage); | |
250 | |
251 memcpy(encoder_buf,Image,encoder_buf_size); | |
252 ++encoder_frameno; | |
253 | |
254 return (int)ret; | |
255 } | |
5550 | 256 #define mux_v (vf->priv->mux) |
257 #define vfw_bih (vf->priv->bih) | |
258 | |
259 static int config(struct vf_instance_s* vf, | |
260 int width, int height, int d_width, int d_height, | |
261 unsigned int flags, unsigned int outfmt){ | |
262 | |
263 vfw_bih->biWidth=width; | |
264 vfw_bih->biHeight=height; | |
265 vfw_bih->biSizeImage=width*height*((vfw_bih->biBitCount+7)/8); | |
12061 | 266 mux_v->aspect = (float)d_width/d_height; |
5551 | 267 |
268 if(!vfw_start_encoder(vfw_bih, mux_v->bih)) return 0; | |
269 | |
270 // mux_v->bih->biWidth=width; | |
271 // mux_v->bih->biHeight=height; | |
272 // mux_v->bih->biSizeImage=width*height*((mux_v->bih->biBitCount+7)/8); | |
5550 | 273 |
274 return 1; | |
275 } | |
276 | |
277 static int control(struct vf_instance_s* vf, int request, void* data){ | |
278 | |
279 return CONTROL_UNKNOWN; | |
280 } | |
281 | |
282 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14878
diff
changeset
|
283 if(fmt==IMGFMT_BGR24) return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_FLIPPED; |
5550 | 284 return 0; |
285 } | |
286 | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17487
diff
changeset
|
287 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ |
5550 | 288 long flags=0; |
289 int ret; | |
290 // flip_upside_down(vo_image_ptr,vo_image_ptr,3*vo_w,vo_h); // dirty hack | |
291 ret=vfw_encode_frame(mux_v->bih, mux_v->buffer, vfw_bih, mpi->planes[0], &flags, 10000); | |
22252
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
292 // if (ret != ICERR_OK) |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
293 // return 0; |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17487
diff
changeset
|
294 muxer_write_chunk(mux_v,mux_v->bih->biSizeImage,flags, pts, pts); |
7368 | 295 return 1; |
5550 | 296 } |
297 | |
298 //===========================================================================// | |
299 | |
300 static int vf_open(vf_instance_t *vf, char* args){ | |
301 vf->config=config; | |
14878 | 302 vf->default_caps=VFCAP_CONSTANT; |
5550 | 303 vf->control=control; |
304 vf->query_format=query_format; | |
305 vf->put_image=put_image; | |
306 vf->priv=malloc(sizeof(struct vf_priv_s)); | |
307 memset(vf->priv,0,sizeof(struct vf_priv_s)); | |
8585 | 308 vf->priv->mux=(muxer_stream_t*)args; |
5550 | 309 |
14549
acf3241be19b
Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents:
12061
diff
changeset
|
310 vfw_bih=calloc(1, sizeof(BITMAPINFOHEADER)); |
5550 | 311 vfw_bih->biSize=sizeof(BITMAPINFOHEADER); |
312 vfw_bih->biWidth=0; // FIXME ? | |
313 vfw_bih->biHeight=0; | |
314 vfw_bih->biPlanes=1; | |
315 vfw_bih->biBitCount=24; | |
316 vfw_bih->biCompression=0; | |
317 // vfw_bih->biSizeImage=vo_w*vo_h*((vfw_bih->biBitCount+7)/8); | |
6083 | 318 |
319 if (!vfw_param_codec) | |
320 { | |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17969
diff
changeset
|
321 mp_msg(MSGT_WIN32,MSGL_WARN, MSGTR_MPCODECS_NoVfwCodecSpecified); |
6083 | 322 return 0; |
323 } | |
5550 | 324 // mux_v->bih=vfw_open_encoder("divxc32.dll",vfw_bih,mmioFOURCC('D', 'I', 'V', '3')); |
6083 | 325 // mux_v->bih=vfw_open_encoder("AvidAVICodec.dll",vfw_bih, 0); |
22252
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
326 mux_v->bih = vfw_open_encoder(vfw_param_codec, vfw_param_compdata, vfw_bih, 0); |
5550 | 327 if(!mux_v->bih) return 0; |
328 | |
329 return 1; | |
330 } | |
331 | |
332 vf_info_t ve_info_vfw = { | |
333 "Win32/VfW encoders", | |
334 "vfw", | |
335 "A'rpi", | |
336 "for internal use by mencoder", | |
337 vf_open | |
338 }; | |
339 | |
340 //===========================================================================// |