Mercurial > mplayer.hg
annotate libmpcodecs/ve_vfw.c @ 25944:8a1c062707ff
Do not uselessly erase background, OpenGL will take care of drawing everything.
author | reimar |
---|---|
date | Sun, 10 Feb 2008 19:47:54 +0000 |
parents | f1922d2b1925 |
children | 20a126aaa756 |
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" |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
22 #include "loader/wine/winerror.h" |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
23 #include "loader/wine/objbase.h" |
5550 | 24 |
5607 | 25 #include "img_format.h" |
26 #include "mp_image.h" | |
5550 | 27 #include "vf.h" |
28 | |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
22577
diff
changeset
|
29 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
30 #include "libmpdemux/muxer.h" |
8585 | 31 |
5550 | 32 //===========================================================================// |
33 | |
6083 | 34 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
|
35 static char *vfw_param_compdata = NULL; |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
36 static HRESULT CoInitRes = -1; |
6083 | 37 |
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
|
38 #include "m_option.h" |
6083 | 39 |
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
|
40 m_option_t vfwopts_conf[]={ |
6083 | 41 {"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
|
42 {"compdata", &vfw_param_compdata, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
6083 | 43 {NULL, NULL, 0, 0, 0, 0, NULL} |
44 }; | |
45 | |
5550 | 46 struct vf_priv_s { |
8585 | 47 muxer_stream_t* mux; |
5550 | 48 BITMAPINFOHEADER* bih; |
49 }; | |
50 | |
7557 | 51 static HIC encoder_hic; |
7231 | 52 static void* encoder_buf=NULL; |
53 static int encoder_buf_size=0; | |
54 static int encoder_frameno=0; | |
55 | |
56 //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
|
57 static BITMAPINFOHEADER* vfw_open_encoder(char *dll_name, char *compdatafile, BITMAPINFOHEADER *input_bih,unsigned int out_fourcc) |
7231 | 58 { |
59 HRESULT ret; | |
60 BITMAPINFOHEADER* output_bih=NULL; | |
61 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
|
62 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
|
63 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
|
64 struct stat st; |
7231 | 65 |
66 //sh_video = malloc(sizeof(sh_video_t)); | |
67 | |
68 mp_msg(MSGT_WIN32,MSGL_V,"======= Win32 (VFW) VIDEO Encoder init =======\n"); | |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
69 CoInitRes = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); |
7231 | 70 // memset(&sh_video->o_bih, 0, sizeof(BITMAPINFOHEADER)); |
71 // output_bih->biSize = sizeof(BITMAPINFOHEADER); | |
72 | |
7390 | 73 // encoder_hic = ICOpen( 0x63646976, out_fourcc, ICMODE_COMPRESS); |
7557 | 74 encoder_hic = ICOpen( (long) dll_name, out_fourcc, ICMODE_COMPRESS); |
7231 | 75 if(!encoder_hic){ |
76 mp_msg(MSGT_WIN32,MSGL_ERR,"ICOpen failed! unknown codec / wrong parameters?\n"); | |
77 return NULL; | |
78 } | |
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
|
79 mp_msg(MSGT_WIN32,MSGL_INFO,"HIC: %x\n", encoder_hic); |
7231 | 80 |
81 #if 1 | |
82 { | |
83 ICINFO icinfo; | |
84 | |
85 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
|
86 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
|
87 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
|
88 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
|
89 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_CompressorFlags, |
7231 | 90 icinfo.dwFlags, icinfo.dwVersion, icinfo.dwVersionICM); |
91 //printf("Compressor name: %s\n", icinfo.szName); | |
92 //printf("Compressor description: %s\n", icinfo.szDescription); | |
93 | |
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
|
94 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_Flags); |
7231 | 95 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
|
96 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_Quality); |
7231 | 97 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
|
98 mp_msg(MSGT_WIN32,MSGL_INFO," fast-decompr"); |
7231 | 99 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
|
100 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
|
101 mp_msg(MSGT_WIN32,MSGL_INFO,"\n"); |
7231 | 102 } |
103 #endif | |
104 | |
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
|
105 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
|
106 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
|
107 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
|
108 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
|
109 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
|
110 } |
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 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
|
112 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
|
113 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
|
114 } |
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 } |
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 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
|
117 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
|
118 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
|
119 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
|
120 } |
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 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
|
122 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
|
123 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
|
124 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
|
125 } |
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 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
|
127 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
|
128 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
|
129 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
|
130 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
|
131 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
|
132 } |
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 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
|
134 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
|
135 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
|
136 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
|
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 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
|
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 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
|
141 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
|
142 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
143 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
144 |
7231 | 145 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
|
146 mp_msg(MSGT_WIN32,MSGL_INFO,"ICCompressGetFormatSize ret: %d\n", temp_len); |
7231 | 147 |
148 if (temp_len < sizeof(BITMAPINFOHEADER)) temp_len=sizeof(BITMAPINFOHEADER); | |
149 | |
150 output_bih = malloc(temp_len+4); | |
151 memset(output_bih,0,temp_len); | |
152 output_bih->biSize = temp_len; //sizeof(BITMAPINFOHEADER); | |
153 | |
154 return output_bih; | |
155 } | |
156 | |
157 static int vfw_start_encoder(BITMAPINFOHEADER *input_bih, BITMAPINFOHEADER *output_bih){ | |
158 HRESULT ret; | |
159 int temp_len=output_bih->biSize; | |
160 int i; | |
161 | |
162 ret = ICCompressGetFormat(encoder_hic, input_bih, output_bih); | |
163 if(ret < 0){ | |
164 unsigned char* temp=(unsigned char*)output_bih; | |
165 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressGetFormat failed: Error %d (0x%X)\n", (int)ret, (int)ret); | |
166 for (i=0; i < temp_len; i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02x ", temp[i]); | |
167 return 0; | |
168 } | |
169 mp_msg(MSGT_WIN32,MSGL_V,"ICCompressGetFormat OK\n"); | |
170 | |
171 if (temp_len > sizeof(BITMAPINFOHEADER)) | |
172 { | |
173 unsigned char* temp=(unsigned char*)output_bih; | |
174 mp_msg(MSGT_WIN32, MSGL_V, "Extra info in o_bih (%d bytes)!\n", | |
175 temp_len-sizeof(BITMAPINFOHEADER)); | |
176 for(i=sizeof(output_bih);i<temp_len;i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02X ",temp[i]); | |
177 } | |
178 | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
17906
diff
changeset
|
179 // if( mp_msg_test(MSGT_WIN32,MSGL_V) ) { |
7231 | 180 printf("Starting compression:\n"); |
181 printf(" Input format:\n"); | |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
182 printf(" biSize %ld\n", input_bih->biSize); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
183 printf(" biWidth %ld\n", input_bih->biWidth); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
184 printf(" biHeight %ld\n", input_bih->biHeight); |
7231 | 185 printf(" biPlanes %d\n", input_bih->biPlanes); |
186 printf(" biBitCount %d\n", input_bih->biBitCount); | |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
187 printf(" biCompression 0x%lx ('%.4s')\n", input_bih->biCompression, (char *)&input_bih->biCompression); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
188 printf(" biSizeImage %ld\n", input_bih->biSizeImage); |
7231 | 189 printf(" Output format:\n"); |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
190 printf(" biSize %ld\n", output_bih->biSize); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
191 printf(" biWidth %ld\n", output_bih->biWidth); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
192 printf(" biHeight %ld\n", output_bih->biHeight); |
7231 | 193 printf(" biPlanes %d\n", output_bih->biPlanes); |
194 printf(" biBitCount %d\n", output_bih->biBitCount); | |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
195 printf(" biCompression 0x%lx ('%.4s')\n", output_bih->biCompression, (char *)&output_bih->biCompression); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
196 printf(" biSizeImage %ld\n", output_bih->biSizeImage); |
7231 | 197 // } |
198 | |
199 output_bih->biWidth=input_bih->biWidth; | |
200 output_bih->biHeight=input_bih->biHeight; | |
201 | |
202 ret = ICCompressQuery(encoder_hic, input_bih, output_bih); | |
203 if(ret){ | |
204 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressQuery failed: Error %d\n", (int)ret); | |
205 return 0; | |
206 } else | |
207 mp_msg(MSGT_WIN32,MSGL_V,"ICCompressQuery OK\n"); | |
208 | |
209 ret = ICCompressBegin(encoder_hic, input_bih, output_bih); | |
210 if(ret){ | |
211 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressBegin failed: Error %d\n", (int)ret); | |
212 // return 0; | |
213 } 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
|
214 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
|
215 mp_msg(MSGT_WIN32,MSGL_INFO," Output format after query/begin:\n"); |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
216 mp_msg(MSGT_WIN32,MSGL_INFO," biSize %ld\n", output_bih->biSize); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
217 mp_msg(MSGT_WIN32,MSGL_INFO," biWidth %ld\n", output_bih->biWidth); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
218 mp_msg(MSGT_WIN32,MSGL_INFO," biHeight %ld\n", output_bih->biHeight); |
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
|
219 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
|
220 mp_msg(MSGT_WIN32,MSGL_INFO," biBitCount %d\n", output_bih->biBitCount); |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
221 mp_msg(MSGT_WIN32,MSGL_INFO," biCompression 0x%lx ('%.4s')\n", output_bih->biCompression, (char *)&output_bih->biCompression); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
222 mp_msg(MSGT_WIN32,MSGL_INFO," biSizeImage %ld\n", output_bih->biSizeImage); |
7231 | 223 |
224 encoder_buf_size=input_bih->biSizeImage; | |
225 encoder_buf=malloc(encoder_buf_size); | |
226 encoder_frameno=0; | |
227 | |
228 mp_msg(MSGT_WIN32,MSGL_V,"VIDEO CODEC Init OK!!! ;-)\n"); | |
229 return 1; | |
230 } | |
231 | |
232 static int vfw_encode_frame(BITMAPINFOHEADER* biOutput,void* OutBuf, | |
233 BITMAPINFOHEADER* biInput,void* Image, | |
234 long* keyframe, int quality){ | |
235 HRESULT ret; | |
236 | |
237 //long VFWAPIV ICCompress( | |
238 // HIC hic,long dwFlags,LPBITMAPINFOHEADER lpbiOutput,void* lpOutputBuf, | |
239 // LPBITMAPINFOHEADER lpbiInput,void* lpImage,long* lpckid, | |
240 // long* lpdwFlags,long lFrameNum,long dwFrameSize,long dwQuality, | |
241 // LPBITMAPINFOHEADER lpbiInputPrev,void* lpImagePrev | |
242 //); | |
243 | |
244 // printf("vfw_encode_frame(%p,%p, %p,%p, %p,%d)\n",biOutput,OutBuf,biInput,Image,keyframe,quality); | |
245 | |
246 ret=ICCompress(encoder_hic, 0, | |
247 biOutput, OutBuf, | |
248 biInput, Image, | |
249 NULL, keyframe, encoder_frameno, 0, quality, | |
250 biInput, encoder_buf); | |
251 | |
252 // printf("ok. size=%d\n",biOutput->biSizeImage); | |
253 | |
254 memcpy(encoder_buf,Image,encoder_buf_size); | |
255 ++encoder_frameno; | |
256 | |
257 return (int)ret; | |
258 } | |
5550 | 259 #define mux_v (vf->priv->mux) |
260 #define vfw_bih (vf->priv->bih) | |
261 | |
262 static int config(struct vf_instance_s* vf, | |
263 int width, int height, int d_width, int d_height, | |
264 unsigned int flags, unsigned int outfmt){ | |
265 | |
266 vfw_bih->biWidth=width; | |
267 vfw_bih->biHeight=height; | |
268 vfw_bih->biSizeImage=width*height*((vfw_bih->biBitCount+7)/8); | |
12061 | 269 mux_v->aspect = (float)d_width/d_height; |
5551 | 270 |
271 if(!vfw_start_encoder(vfw_bih, mux_v->bih)) return 0; | |
272 | |
273 // mux_v->bih->biWidth=width; | |
274 // mux_v->bih->biHeight=height; | |
275 // mux_v->bih->biSizeImage=width*height*((mux_v->bih->biBitCount+7)/8); | |
5550 | 276 |
277 return 1; | |
278 } | |
279 | |
280 static int control(struct vf_instance_s* vf, int request, void* data){ | |
281 | |
282 return CONTROL_UNKNOWN; | |
283 } | |
284 | |
285 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
|
286 if(fmt==IMGFMT_BGR24) return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_FLIPPED; |
5550 | 287 return 0; |
288 } | |
289 | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17487
diff
changeset
|
290 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ |
5550 | 291 long flags=0; |
292 int ret; | |
293 // flip_upside_down(vo_image_ptr,vo_image_ptr,3*vo_w,vo_h); // dirty hack | |
294 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
|
295 // 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
|
296 // 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
|
297 muxer_write_chunk(mux_v,mux_v->bih->biSizeImage,flags, pts, pts); |
7368 | 298 return 1; |
5550 | 299 } |
300 | |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
301 static void uninit(struct vf_instance_s* vf) |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
302 { |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
303 HRESULT ret; |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
304 |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
305 if(encoder_hic){ |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
306 if(encoder_buf){ |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
307 ret=ICCompressEnd(encoder_hic); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
308 if(ret) mp_msg(MSGT_WIN32, MSGL_WARN, "ICCompressEnd failed: %ld\n", ret); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
309 free(encoder_buf); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
310 encoder_buf=NULL; |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
311 } |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
312 ret=ICClose(encoder_hic); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
313 if(ret) mp_msg(MSGT_WIN32, MSGL_WARN, "ICClose failed: %ld\n", ret); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
314 encoder_hic=0; |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
315 if ((CoInitRes == S_OK) || (CoInitRes == S_FALSE)) CoUninitialize(); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
316 } |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
317 } |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
318 |
5550 | 319 //===========================================================================// |
320 | |
321 static int vf_open(vf_instance_t *vf, char* args){ | |
322 vf->config=config; | |
14878 | 323 vf->default_caps=VFCAP_CONSTANT; |
5550 | 324 vf->control=control; |
325 vf->query_format=query_format; | |
326 vf->put_image=put_image; | |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
327 vf->uninit=uninit; |
5550 | 328 vf->priv=malloc(sizeof(struct vf_priv_s)); |
329 memset(vf->priv,0,sizeof(struct vf_priv_s)); | |
8585 | 330 vf->priv->mux=(muxer_stream_t*)args; |
5550 | 331 |
14549
acf3241be19b
Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents:
12061
diff
changeset
|
332 vfw_bih=calloc(1, sizeof(BITMAPINFOHEADER)); |
5550 | 333 vfw_bih->biSize=sizeof(BITMAPINFOHEADER); |
334 vfw_bih->biWidth=0; // FIXME ? | |
335 vfw_bih->biHeight=0; | |
336 vfw_bih->biPlanes=1; | |
337 vfw_bih->biBitCount=24; | |
338 vfw_bih->biCompression=0; | |
339 // vfw_bih->biSizeImage=vo_w*vo_h*((vfw_bih->biBitCount+7)/8); | |
6083 | 340 |
341 if (!vfw_param_codec) | |
342 { | |
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
|
343 mp_msg(MSGT_WIN32,MSGL_WARN, MSGTR_MPCODECS_NoVfwCodecSpecified); |
6083 | 344 return 0; |
345 } | |
5550 | 346 // mux_v->bih=vfw_open_encoder("divxc32.dll",vfw_bih,mmioFOURCC('D', 'I', 'V', '3')); |
6083 | 347 // 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
|
348 mux_v->bih = vfw_open_encoder(vfw_param_codec, vfw_param_compdata, vfw_bih, 0); |
5550 | 349 if(!mux_v->bih) return 0; |
350 | |
351 return 1; | |
352 } | |
353 | |
354 vf_info_t ve_info_vfw = { | |
355 "Win32/VfW encoders", | |
356 "vfw", | |
357 "A'rpi", | |
358 "for internal use by mencoder", | |
359 vf_open | |
360 }; | |
361 | |
362 //===========================================================================// |