Mercurial > mplayer.hg
annotate libmpcodecs/ve_vfw.c @ 30017:7119354805e7
Use on-stack subtitle struct for temporary storage for passing subtitles on
for rendering by libass.
This avoids mangling the static subtitle struct that is supposed to contain
the subtitles that will actually be displayed and it also minimally reduces
memory usage by freeing the subtitle lines again as early as possible.
author | reimar |
---|---|
date | Fri, 18 Dec 2009 19:29:33 +0000 |
parents | 0f1b5b68af32 |
children | bbb6ebec87a0 |
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" |
26146
20a126aaa756
ve_vfw.c: #include aviheader.h instead of wine avifmt.h
uau
parents:
25262
diff
changeset
|
21 #include "libmpdemux/aviheader.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"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26148
diff
changeset
|
170 |
7231 | 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); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26148
diff
changeset
|
223 |
7231 | 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 | |
26148
d3b951d9b4d3
Fix printf format string mismatch, eliminates the warning:
diego
parents:
26146
diff
changeset
|
252 // printf("ok. size=%ld\n",biOutput->biSizeImage); |
7231 | 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 //===========================================================================// |