Mercurial > mplayer.hg
annotate libmpcodecs/ve_vfw.c @ 35059:568f0925d9a9
Enable panscan for -vo directx.
Not fully working for :noaccel, since it uses
Blt and that does not support scaling beyond
the destination size (or at least it does not
with the current implementation).
author | reimar |
---|---|
date | Fri, 07 Sep 2012 19:16:10 +0000 |
parents | beafae9de2be |
children |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
18 |
5550 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <string.h> | |
7238 | 22 #include <unistd.h> |
8585 | 23 #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
|
24 #include <sys/stat.h> |
5550 | 25 |
17012 | 26 #include "config.h" |
5550 | 27 |
17012 | 28 #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
|
29 #include "help_mp.h" |
5550 | 30 |
31 #include "codec-cfg.h" | |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
22577
diff
changeset
|
32 //#include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
33 //#include "libmpdemux/demuxer.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
34 //#include "libmpdemux/stheader.h" |
7231 | 35 |
22577
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
22252
diff
changeset
|
36 #include "loader/loader.h" |
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
22252
diff
changeset
|
37 //#include "loader/wine/mmreg.h" |
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
22252
diff
changeset
|
38 #include "loader/wine/vfw.h" |
26146
20a126aaa756
ve_vfw.c: #include aviheader.h instead of wine avifmt.h
uau
parents:
25262
diff
changeset
|
39 #include "libmpdemux/aviheader.h" |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
40 #include "loader/wine/winerror.h" |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
41 #include "loader/wine/objbase.h" |
5550 | 42 |
5607 | 43 #include "img_format.h" |
44 #include "mp_image.h" | |
5550 | 45 #include "vf.h" |
46 | |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
22577
diff
changeset
|
47 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
48 #include "libmpdemux/muxer.h" |
8585 | 49 |
5550 | 50 //===========================================================================// |
51 | |
6083 | 52 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
|
53 static char *vfw_param_compdata = NULL; |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
54 static HRESULT CoInitRes = -1; |
6083 | 55 |
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
|
56 #include "m_option.h" |
6083 | 57 |
30955
4e59a7aebadb
Mark encoder-related m_option_t struct arrays as const.
diego
parents:
30702
diff
changeset
|
58 const m_option_t vfwopts_conf[]={ |
6083 | 59 {"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
|
60 {"compdata", &vfw_param_compdata, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
6083 | 61 {NULL, NULL, 0, 0, 0, 0, NULL} |
62 }; | |
63 | |
5550 | 64 struct vf_priv_s { |
8585 | 65 muxer_stream_t* mux; |
5550 | 66 BITMAPINFOHEADER* bih; |
67 }; | |
68 | |
7557 | 69 static HIC encoder_hic; |
7231 | 70 static void* encoder_buf=NULL; |
71 static int encoder_buf_size=0; | |
72 static int encoder_frameno=0; | |
73 | |
74 //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
|
75 static BITMAPINFOHEADER* vfw_open_encoder(char *dll_name, char *compdatafile, BITMAPINFOHEADER *input_bih,unsigned int out_fourcc) |
7231 | 76 { |
77 HRESULT ret; | |
78 BITMAPINFOHEADER* output_bih=NULL; | |
79 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
|
80 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
|
81 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
|
82 struct stat st; |
7231 | 83 |
84 //sh_video = malloc(sizeof(sh_video_t)); | |
85 | |
86 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
|
87 CoInitRes = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); |
7231 | 88 // memset(&sh_video->o_bih, 0, sizeof(BITMAPINFOHEADER)); |
89 // output_bih->biSize = sizeof(BITMAPINFOHEADER); | |
90 | |
7390 | 91 // encoder_hic = ICOpen( 0x63646976, out_fourcc, ICMODE_COMPRESS); |
7557 | 92 encoder_hic = ICOpen( (long) dll_name, out_fourcc, ICMODE_COMPRESS); |
7231 | 93 if(!encoder_hic){ |
94 mp_msg(MSGT_WIN32,MSGL_ERR,"ICOpen failed! unknown codec / wrong parameters?\n"); | |
95 return NULL; | |
96 } | |
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,"HIC: %x\n", encoder_hic); |
7231 | 98 |
99 { | |
100 ICINFO icinfo; | |
101 | |
102 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
|
103 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
|
104 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
|
105 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
|
106 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_CompressorFlags, |
7231 | 107 icinfo.dwFlags, icinfo.dwVersion, icinfo.dwVersionICM); |
108 //printf("Compressor name: %s\n", icinfo.szName); | |
109 //printf("Compressor description: %s\n", icinfo.szDescription); | |
110 | |
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
|
111 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_Flags); |
7231 | 112 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
|
113 mp_msg(MSGT_WIN32,MSGL_INFO,MSGTR_MPCODECS_Quality); |
7231 | 114 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
|
115 mp_msg(MSGT_WIN32,MSGL_INFO," fast-decompr"); |
7231 | 116 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
|
117 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
|
118 mp_msg(MSGT_WIN32,MSGL_INFO,"\n"); |
7231 | 119 } |
120 | |
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
|
121 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
|
122 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
|
123 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
|
124 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
|
125 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
|
126 } |
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 (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
|
128 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
|
129 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
|
130 } |
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 } |
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 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
|
133 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
|
134 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
|
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 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
|
138 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
|
139 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
|
140 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
|
141 } |
30702 | 142 drvdata = malloc(st.st_size); |
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
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
149 fclose(fd); |
34144
beafae9de2be
Employ correct off_t printf conversion specifiers; this time without typos.
diego
parents:
34139
diff
changeset
|
150 mp_msg(MSGT_WIN32,MSGL_ERR,"Compressor data %"PRIu64" bytes\n", st.st_size); |
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
|
151 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
|
152 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
|
153 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
|
154 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
|
155 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
156 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
|
157 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
|
158 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
159 } |
c5a591c4a372
Controllable quality setting of VFW enconding, through the dumped state of the dialog box. Patch by Gianluigi Tiesi
alex
parents:
21660
diff
changeset
|
160 |
7231 | 161 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
|
162 mp_msg(MSGT_WIN32,MSGL_INFO,"ICCompressGetFormatSize ret: %d\n", temp_len); |
7231 | 163 |
164 if (temp_len < sizeof(BITMAPINFOHEADER)) temp_len=sizeof(BITMAPINFOHEADER); | |
165 | |
166 output_bih = malloc(temp_len+4); | |
167 memset(output_bih,0,temp_len); | |
168 output_bih->biSize = temp_len; //sizeof(BITMAPINFOHEADER); | |
169 | |
170 return output_bih; | |
171 } | |
172 | |
173 static int vfw_start_encoder(BITMAPINFOHEADER *input_bih, BITMAPINFOHEADER *output_bih){ | |
174 HRESULT ret; | |
175 int temp_len=output_bih->biSize; | |
176 int i; | |
177 | |
178 ret = ICCompressGetFormat(encoder_hic, input_bih, output_bih); | |
179 if(ret < 0){ | |
180 unsigned char* temp=(unsigned char*)output_bih; | |
181 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressGetFormat failed: Error %d (0x%X)\n", (int)ret, (int)ret); | |
182 for (i=0; i < temp_len; i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02x ", temp[i]); | |
183 return 0; | |
184 } | |
185 mp_msg(MSGT_WIN32,MSGL_V,"ICCompressGetFormat OK\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26148
diff
changeset
|
186 |
7231 | 187 if (temp_len > sizeof(BITMAPINFOHEADER)) |
188 { | |
189 unsigned char* temp=(unsigned char*)output_bih; | |
190 mp_msg(MSGT_WIN32, MSGL_V, "Extra info in o_bih (%d bytes)!\n", | |
191 temp_len-sizeof(BITMAPINFOHEADER)); | |
192 for(i=sizeof(output_bih);i<temp_len;i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02X ",temp[i]); | |
193 } | |
194 | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
17906
diff
changeset
|
195 // if( mp_msg_test(MSGT_WIN32,MSGL_V) ) { |
7231 | 196 printf("Starting compression:\n"); |
197 printf(" Input format:\n"); | |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
198 printf(" biSize %ld\n", input_bih->biSize); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
199 printf(" biWidth %ld\n", input_bih->biWidth); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
200 printf(" biHeight %ld\n", input_bih->biHeight); |
7231 | 201 printf(" biPlanes %d\n", input_bih->biPlanes); |
202 printf(" biBitCount %d\n", input_bih->biBitCount); | |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
203 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
|
204 printf(" biSizeImage %ld\n", input_bih->biSizeImage); |
7231 | 205 printf(" Output format:\n"); |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
206 printf(" biSize %ld\n", output_bih->biSize); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
207 printf(" biWidth %ld\n", output_bih->biWidth); |
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
208 printf(" biHeight %ld\n", output_bih->biHeight); |
7231 | 209 printf(" biPlanes %d\n", output_bih->biPlanes); |
210 printf(" biBitCount %d\n", output_bih->biBitCount); | |
25262
f1922d2b1925
Use correct printf length modifiers, fixes the following warnings:
diego
parents:
24770
diff
changeset
|
211 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
|
212 printf(" biSizeImage %ld\n", output_bih->biSizeImage); |
7231 | 213 // } |
214 | |
215 output_bih->biWidth=input_bih->biWidth; | |
216 output_bih->biHeight=input_bih->biHeight; | |
217 | |
218 ret = ICCompressQuery(encoder_hic, input_bih, output_bih); | |
219 if(ret){ | |
220 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressQuery failed: Error %d\n", (int)ret); | |
221 return 0; | |
222 } else | |
223 mp_msg(MSGT_WIN32,MSGL_V,"ICCompressQuery OK\n"); | |
224 | |
225 ret = ICCompressBegin(encoder_hic, input_bih, output_bih); | |
226 if(ret){ | |
227 mp_msg(MSGT_WIN32,MSGL_ERR,"ICCompressBegin failed: Error %d\n", (int)ret); | |
228 // return 0; | |
229 } 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
|
230 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
|
231 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
|
232 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
|
233 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
|
234 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
|
235 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
|
236 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
|
237 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
|
238 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
|
239 |
7231 | 240 encoder_buf_size=input_bih->biSizeImage; |
241 encoder_buf=malloc(encoder_buf_size); | |
242 encoder_frameno=0; | |
243 | |
244 mp_msg(MSGT_WIN32,MSGL_V,"VIDEO CODEC Init OK!!! ;-)\n"); | |
245 return 1; | |
246 } | |
247 | |
248 static int vfw_encode_frame(BITMAPINFOHEADER* biOutput,void* OutBuf, | |
249 BITMAPINFOHEADER* biInput,void* Image, | |
250 long* keyframe, int quality){ | |
251 HRESULT ret; | |
252 | |
253 //long VFWAPIV ICCompress( | |
254 // HIC hic,long dwFlags,LPBITMAPINFOHEADER lpbiOutput,void* lpOutputBuf, | |
255 // LPBITMAPINFOHEADER lpbiInput,void* lpImage,long* lpckid, | |
256 // long* lpdwFlags,long lFrameNum,long dwFrameSize,long dwQuality, | |
257 // LPBITMAPINFOHEADER lpbiInputPrev,void* lpImagePrev | |
258 //); | |
259 | |
260 // printf("vfw_encode_frame(%p,%p, %p,%p, %p,%d)\n",biOutput,OutBuf,biInput,Image,keyframe,quality); | |
261 | |
262 ret=ICCompress(encoder_hic, 0, | |
263 biOutput, OutBuf, | |
264 biInput, Image, | |
265 NULL, keyframe, encoder_frameno, 0, quality, | |
266 biInput, encoder_buf); | |
267 | |
26148
d3b951d9b4d3
Fix printf format string mismatch, eliminates the warning:
diego
parents:
26146
diff
changeset
|
268 // printf("ok. size=%ld\n",biOutput->biSizeImage); |
7231 | 269 |
270 memcpy(encoder_buf,Image,encoder_buf_size); | |
271 ++encoder_frameno; | |
272 | |
273 return (int)ret; | |
274 } | |
5550 | 275 #define mux_v (vf->priv->mux) |
276 #define vfw_bih (vf->priv->bih) | |
277 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30566
diff
changeset
|
278 static int config(struct vf_instance *vf, |
5550 | 279 int width, int height, int d_width, int d_height, |
280 unsigned int flags, unsigned int outfmt){ | |
281 | |
282 vfw_bih->biWidth=width; | |
283 vfw_bih->biHeight=height; | |
284 vfw_bih->biSizeImage=width*height*((vfw_bih->biBitCount+7)/8); | |
12061 | 285 mux_v->aspect = (float)d_width/d_height; |
5551 | 286 |
287 if(!vfw_start_encoder(vfw_bih, mux_v->bih)) return 0; | |
288 | |
289 // mux_v->bih->biWidth=width; | |
290 // mux_v->bih->biHeight=height; | |
291 // mux_v->bih->biSizeImage=width*height*((mux_v->bih->biBitCount+7)/8); | |
5550 | 292 |
293 return 1; | |
294 } | |
295 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30566
diff
changeset
|
296 static int control(struct vf_instance *vf, int request, void* data){ |
5550 | 297 |
298 return CONTROL_UNKNOWN; | |
299 } | |
300 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30566
diff
changeset
|
301 static int query_format(struct vf_instance *vf, unsigned int fmt){ |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14878
diff
changeset
|
302 if(fmt==IMGFMT_BGR24) return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_FLIPPED; |
5550 | 303 return 0; |
304 } | |
305 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30566
diff
changeset
|
306 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ |
5550 | 307 long flags=0; |
308 int ret; | |
309 // flip_upside_down(vo_image_ptr,vo_image_ptr,3*vo_w,vo_h); // dirty hack | |
310 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
|
311 // 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
|
312 // 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
|
313 muxer_write_chunk(mux_v,mux_v->bih->biSizeImage,flags, pts, pts); |
7368 | 314 return 1; |
5550 | 315 } |
316 | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
30566
diff
changeset
|
317 static void uninit(struct vf_instance *vf) |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
318 { |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
319 HRESULT ret; |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
320 |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
321 if(encoder_hic){ |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
322 if(encoder_buf){ |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
323 ret=ICCompressEnd(encoder_hic); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
324 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
|
325 free(encoder_buf); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
326 encoder_buf=NULL; |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
327 } |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
328 ret=ICClose(encoder_hic); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
329 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
|
330 encoder_hic=0; |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
331 if ((CoInitRes == S_OK) || (CoInitRes == S_FALSE)) CoUninitialize(); |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
332 } |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
333 } |
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
334 |
5550 | 335 //===========================================================================// |
336 | |
337 static int vf_open(vf_instance_t *vf, char* args){ | |
338 vf->config=config; | |
14878 | 339 vf->default_caps=VFCAP_CONSTANT; |
5550 | 340 vf->control=control; |
341 vf->query_format=query_format; | |
342 vf->put_image=put_image; | |
24770
6a8be4b73d07
Add Coinitialize function to vfw encoder and win32 loader.
compn
parents:
22799
diff
changeset
|
343 vf->uninit=uninit; |
5550 | 344 vf->priv=malloc(sizeof(struct vf_priv_s)); |
345 memset(vf->priv,0,sizeof(struct vf_priv_s)); | |
8585 | 346 vf->priv->mux=(muxer_stream_t*)args; |
5550 | 347 |
14549
acf3241be19b
Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents:
12061
diff
changeset
|
348 vfw_bih=calloc(1, sizeof(BITMAPINFOHEADER)); |
5550 | 349 vfw_bih->biSize=sizeof(BITMAPINFOHEADER); |
350 vfw_bih->biWidth=0; // FIXME ? | |
351 vfw_bih->biHeight=0; | |
352 vfw_bih->biPlanes=1; | |
353 vfw_bih->biBitCount=24; | |
354 vfw_bih->biCompression=0; | |
355 // vfw_bih->biSizeImage=vo_w*vo_h*((vfw_bih->biBitCount+7)/8); | |
6083 | 356 |
357 if (!vfw_param_codec) | |
358 { | |
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
|
359 mp_msg(MSGT_WIN32,MSGL_WARN, MSGTR_MPCODECS_NoVfwCodecSpecified); |
6083 | 360 return 0; |
361 } | |
5550 | 362 // mux_v->bih=vfw_open_encoder("divxc32.dll",vfw_bih,mmioFOURCC('D', 'I', 'V', '3')); |
6083 | 363 // 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
|
364 mux_v->bih = vfw_open_encoder(vfw_param_codec, vfw_param_compdata, vfw_bih, 0); |
5550 | 365 if(!mux_v->bih) return 0; |
366 | |
367 return 1; | |
368 } | |
369 | |
32033 | 370 const vf_info_t ve_info_vfw = { |
5550 | 371 "Win32/VfW encoders", |
372 "vfw", | |
373 "A'rpi", | |
374 "for internal use by mencoder", | |
375 vf_open | |
376 }; | |
377 | |
378 //===========================================================================// |