Mercurial > mplayer.hg
annotate libmpcodecs/dec_video.c @ 26355:a8fbc0224b81
Remove Win32 linker option for netstream. Other winsock using code does not
need it, it should be set from configure and the reason why it was set in
the first place has been lost in the mists of time.
author | diego |
---|---|
date | Fri, 11 Apr 2008 07:37:27 +0000 |
parents | afa125da85cf |
children | 63630c09e237 |
rev | line source |
---|---|
2775 | 1 |
2 #include "config.h" | |
1294 | 3 |
4 #include <stdio.h> | |
2775 | 5 #ifdef HAVE_MALLOC_H |
6 #include <malloc.h> | |
7 #endif | |
1294 | 8 #include <stdlib.h> |
1430 | 9 #include <unistd.h> |
1294 | 10 |
1567 | 11 #include "mp_msg.h" |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1949
diff
changeset
|
12 #include "help_mp.h" |
1294 | 13 |
9380 | 14 #include "osdep/timer.h" |
15 #include "osdep/shmem.h" | |
1327
b12e1817bcc2
some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents:
1309
diff
changeset
|
16 |
22599
4faee1254928
Add explicit location for headers from the stream/ directory.
diego
parents:
22498
diff
changeset
|
17 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22599
diff
changeset
|
18 #include "libmpdemux/demuxer.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22599
diff
changeset
|
19 #include "libmpdemux/parse_es.h" |
1294 | 20 |
21 #include "codec-cfg.h" | |
22 | |
23 #include "libvo/video_out.h" | |
24 | |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22599
diff
changeset
|
25 #include "libmpdemux/stheader.h" |
4902
7c4edfe929c8
implemented basic wrapper functions to new libmpcodecs api
arpi
parents:
4901
diff
changeset
|
26 #include "vd.h" |
5507
d0d029fda134
video filter layer - written from scratch, but inspired a lot by Fredrik Kuivinen's patch
arpi
parents:
5328
diff
changeset
|
27 #include "vf.h" |
4188 | 28 |
2563 | 29 #include "dec_video.h" |
30 | |
8152 | 31 #ifdef DYNAMIC_PLUGINS |
32 #include <dlfcn.h> | |
33 #endif | |
34 | |
2563 | 35 // =================================================================== |
36 | |
37 extern double video_time_usage; | |
38 extern double vout_time_usage; | |
39 | |
3144 | 40 #include "cpudetect.h" |
41 | |
22086
8bf15e2ca61e
Add global field dominance flag instead of duplicating this "everywhere"
reimar
parents:
22012
diff
changeset
|
42 int field_dominance=-1; |
8bf15e2ca61e
Add global field dominance flag instead of duplicating this "everywhere"
reimar
parents:
22012
diff
changeset
|
43 |
2563 | 44 int divx_quality=0; |
1294 | 45 |
5180 | 46 vd_functions_t* mpvdec=NULL; |
4902
7c4edfe929c8
implemented basic wrapper functions to new libmpcodecs api
arpi
parents:
4901
diff
changeset
|
47 |
1429 | 48 int get_video_quality_max(sh_video_t *sh_video){ |
5519 | 49 vf_instance_t* vf=sh_video->vfilter; |
50 if(vf){ | |
51 int ret=vf->control(vf,VFCTRL_QUERY_MAX_PP_LEVEL,NULL); | |
52 if(ret>0){ | |
6989 | 53 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_UsingExternalPP,ret); |
5519 | 54 return ret; |
55 } | |
56 } | |
4957 | 57 if(mpvdec){ |
4967 | 58 int ret=mpvdec->control(sh_video,VDCTRL_QUERY_MAX_PP_LEVEL,NULL); |
5519 | 59 if(ret>0){ |
6989 | 60 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_UsingCodecPP,ret); |
5519 | 61 return ret; |
62 } | |
4957 | 63 } |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5984
diff
changeset
|
64 // mp_msg(MSGT_DECVIDEO,MSGL_INFO,"[PP] Sorry, postprocessing is not available\n"); |
5519 | 65 return 0; |
1429 | 66 } |
67 | |
68 void set_video_quality(sh_video_t *sh_video,int quality){ | |
5519 | 69 vf_instance_t* vf=sh_video->vfilter; |
70 if(vf){ | |
71 int ret=vf->control(vf,VFCTRL_SET_PP_LEVEL, (void*)(&quality)); | |
72 if(ret==CONTROL_TRUE) return; // success | |
73 } | |
4957 | 74 if(mpvdec) |
75 mpvdec->control(sh_video,VDCTRL_SET_PP_LEVEL, (void*)(&quality)); | |
1429 | 76 } |
77 | |
25224 | 78 int set_video_colors(sh_video_t *sh_video,const char *item,int value) |
4395 | 79 { |
6780 | 80 vf_instance_t* vf=sh_video->vfilter; |
6832
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
81 vf_equalizer_t data; |
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
82 |
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
83 data.item = item; |
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
84 data.value = value; |
6786 | 85 |
86 mp_dbg(MSGT_DECVIDEO,MSGL_V,"set video colors %s=%d \n", item, value); | |
6785 | 87 if (vf) |
88 { | |
6832
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
89 int ret = vf->control(vf, VFCTRL_SET_EQUALIZER, &data); |
6785 | 90 if (ret == CONTROL_TRUE) |
91 return(1); | |
92 } | |
6780 | 93 /* try software control */ |
6800 | 94 if(mpvdec) |
95 if( mpvdec->control(sh_video,VDCTRL_SET_EQUALIZER, item, (int *)value) | |
96 == CONTROL_OK) return 1; | |
18190 | 97 mp_msg(MSGT_DECVIDEO,MSGL_V,MSGTR_VideoAttributeNotSupportedByVO_VD,item); |
6780 | 98 return 0; |
99 } | |
100 | |
25224 | 101 int get_video_colors(sh_video_t *sh_video,const char *item,int *value) |
6780 | 102 { |
103 vf_instance_t* vf=sh_video->vfilter; | |
6832
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
104 vf_equalizer_t data; |
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
105 |
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
106 data.item = item; |
6786 | 107 |
108 mp_dbg(MSGT_DECVIDEO,MSGL_V,"get video colors %s \n", item); | |
109 if (vf) | |
110 { | |
6832
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
111 int ret = vf->control(vf, VFCTRL_GET_EQUALIZER, &data); |
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
112 if (ret == CONTROL_TRUE){ |
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
113 *value = data.value; |
6786 | 114 return(1); |
6832
54578e5a8050
... removed from vf's control(), sing struct for equalizer. based on patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6800
diff
changeset
|
115 } |
6786 | 116 } |
6780 | 117 /* try software control */ |
118 if(mpvdec) return mpvdec->control(sh_video,VDCTRL_GET_EQUALIZER, item, value); | |
1429 | 119 return 0; |
120 } | |
1294 | 121 |
6887 | 122 int set_rectangle(sh_video_t *sh_video,int param,int value) |
123 { | |
124 vf_instance_t* vf=sh_video->vfilter; | |
125 int data[] = {param, value}; | |
126 | |
127 mp_dbg(MSGT_DECVIDEO,MSGL_V,"set rectangle \n"); | |
128 if (vf) | |
129 { | |
130 int ret = vf->control(vf, VFCTRL_CHANGE_RECTANGLE, data); | |
131 if (ret) | |
132 return(1); | |
133 } | |
134 return 0; | |
135 } | |
136 | |
11977
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
10683
diff
changeset
|
137 void resync_video_stream(sh_video_t *sh_video) |
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
10683
diff
changeset
|
138 { |
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
10683
diff
changeset
|
139 if(mpvdec) mpvdec->control(sh_video, VDCTRL_RESYNC_STREAM, NULL); |
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
10683
diff
changeset
|
140 } |
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
10683
diff
changeset
|
141 |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
142 int get_current_video_decoder_lag(sh_video_t *sh_video) |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
143 { |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
144 int ret; |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
145 |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
146 if (!mpvdec) |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
147 return -1; |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
148 ret = mpvdec->control(sh_video, VDCTRL_QUERY_UNSEEN_FRAMES, NULL); |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
149 if (ret >= 10) |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
150 return ret-10; |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
151 return -1; |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
152 } |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
153 |
2049
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
2044
diff
changeset
|
154 void uninit_video(sh_video_t *sh_video){ |
25962 | 155 if(!sh_video->initialized) return; |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
7124
diff
changeset
|
156 mp_msg(MSGT_DECVIDEO,MSGL_V,MSGTR_UninitVideoStr,sh_video->codec->drv); |
4902
7c4edfe929c8
implemented basic wrapper functions to new libmpcodecs api
arpi
parents:
4901
diff
changeset
|
157 mpvdec->uninit(sh_video); |
8152 | 158 #ifdef DYNAMIC_PLUGINS |
159 if (sh_video->dec_handle) | |
160 dlclose(sh_video->dec_handle); | |
161 #endif | |
5737 | 162 vf_uninit_filter_chain(sh_video->vfilter); |
25962 | 163 sh_video->initialized=0; |
1654 | 164 } |
165 | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16793
diff
changeset
|
166 void vfm_help(void){ |
7191
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
167 int i; |
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
168 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_AvailableVideoFm); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18190
diff
changeset
|
169 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_DRIVERS\n"); |
7191
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
170 mp_msg(MSGT_DECVIDEO,MSGL_INFO," vfm: info: (comment)\n"); |
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
171 for (i=0; mpcodecs_vd_drivers[i] != NULL; i++) |
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
172 mp_msg(MSGT_DECVIDEO,MSGL_INFO,"%8s %s (%s)\n", |
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
173 mpcodecs_vd_drivers[i]->info->short_name, |
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
174 mpcodecs_vd_drivers[i]->info->name, |
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
175 mpcodecs_vd_drivers[i]->info->comment); |
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
176 } |
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
177 |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
178 static int init_video(sh_video_t *sh_video,char* codecname,char* vfm,int status, |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
179 stringset_t *selected){ |
16325 | 180 int force = 0; |
6230
936aa617e829
restore original bih->biCompression if codec init failed
arpi
parents:
6138
diff
changeset
|
181 unsigned int orig_fourcc=sh_video->bih?sh_video->bih->biCompression:0; |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
182 sh_video->codec=NULL; |
25962 | 183 sh_video->vf_initialized=0; |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15789
diff
changeset
|
184 if (codecname && codecname[0] == '+') { |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15789
diff
changeset
|
185 codecname = &codecname[1]; |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15789
diff
changeset
|
186 force = 1; |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15789
diff
changeset
|
187 } |
6230
936aa617e829
restore original bih->biCompression if codec init failed
arpi
parents:
6138
diff
changeset
|
188 |
936aa617e829
restore original bih->biCompression if codec init failed
arpi
parents:
6138
diff
changeset
|
189 while(1){ |
936aa617e829
restore original bih->biCompression if codec init failed
arpi
parents:
6138
diff
changeset
|
190 int i; |
22012
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
191 int orig_w, orig_h; |
6230
936aa617e829
restore original bih->biCompression if codec init failed
arpi
parents:
6138
diff
changeset
|
192 // restore original fourcc: |
936aa617e829
restore original bih->biCompression if codec init failed
arpi
parents:
6138
diff
changeset
|
193 if(sh_video->bih) sh_video->bih->biCompression=orig_fourcc; |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15789
diff
changeset
|
194 if(!(sh_video->codec=find_video_codec(sh_video->format, |
6230
936aa617e829
restore original bih->biCompression if codec init failed
arpi
parents:
6138
diff
changeset
|
195 sh_video->bih?((unsigned int*) &sh_video->bih->biCompression):NULL, |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15789
diff
changeset
|
196 sh_video->codec,force) )) break; |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
197 // ok we found one codec |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
198 if(stringset_test(selected, sh_video->codec->name)) continue; // already tried & failed |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
199 if(codecname && strcmp(sh_video->codec->name,codecname)) continue; // -vc |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
7124
diff
changeset
|
200 if(vfm && strcmp(sh_video->codec->drv,vfm)) continue; // vfm doesn't match |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15789
diff
changeset
|
201 if(!force && sh_video->codec->status<status) continue; // too unstable |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
202 stringset_add(selected, sh_video->codec->name); // tagging it |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
203 // ok, it matches all rules, let's find the driver! |
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
204 for (i=0; mpcodecs_vd_drivers[i] != NULL; i++) |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
7124
diff
changeset
|
205 // if(mpcodecs_vd_drivers[i]->info->id==sh_video->codec->driver) break; |
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
7124
diff
changeset
|
206 if(!strcmp(mpcodecs_vd_drivers[i]->info->short_name,sh_video->codec->drv)) break; |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
207 mpvdec=mpcodecs_vd_drivers[i]; |
8152 | 208 #ifdef DYNAMIC_PLUGINS |
209 if (!mpvdec) | |
210 { | |
211 /* try to open shared decoder plugin */ | |
212 int buf_len; | |
213 char *buf; | |
214 vd_functions_t *funcs_sym; | |
215 vd_info_t *info_sym; | |
216 | |
10272
7b0bc557987b
renames: DATADIR->MPLAYER_DATADIR, CONFDIR->MPLAYER_CONFDIR, LIBDIR->MPLAYER_LIBDIR
arpi
parents:
9426
diff
changeset
|
217 buf_len = strlen(MPLAYER_LIBDIR)+strlen(sh_video->codec->drv)+16; |
8152 | 218 buf = malloc(buf_len); |
219 if (!buf) | |
220 break; | |
10272
7b0bc557987b
renames: DATADIR->MPLAYER_DATADIR, CONFDIR->MPLAYER_CONFDIR, LIBDIR->MPLAYER_LIBDIR
arpi
parents:
9426
diff
changeset
|
221 snprintf(buf, buf_len, "%s/mplayer/vd_%s.so", MPLAYER_LIBDIR, sh_video->codec->drv); |
8152 | 222 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, "Trying to open external plugin: %s\n", buf); |
223 sh_video->dec_handle = dlopen(buf, RTLD_LAZY); | |
224 if (!sh_video->dec_handle) | |
225 break; | |
226 snprintf(buf, buf_len, "mpcodecs_vd_%s", sh_video->codec->drv); | |
227 funcs_sym = dlsym(sh_video->dec_handle, buf); | |
228 if (!funcs_sym || !funcs_sym->info || !funcs_sym->init || | |
229 !funcs_sym->uninit || !funcs_sym->control || !funcs_sym->decode) | |
230 break; | |
231 info_sym = funcs_sym->info; | |
232 if (strcmp(info_sym->short_name, sh_video->codec->drv)) | |
233 break; | |
234 free(buf); | |
235 mpvdec = funcs_sym; | |
236 mp_msg(MSGT_DECVIDEO, MSGL_V, "Using external decoder plugin (%s/mplayer/vd_%s.so)!\n", | |
10272
7b0bc557987b
renames: DATADIR->MPLAYER_DATADIR, CONFDIR->MPLAYER_CONFDIR, LIBDIR->MPLAYER_LIBDIR
arpi
parents:
9426
diff
changeset
|
237 MPLAYER_LIBDIR, sh_video->codec->drv); |
8152 | 238 } |
239 #endif | |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
240 if(!mpvdec){ // driver not available (==compiled in) |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
7124
diff
changeset
|
241 mp_msg(MSGT_DECVIDEO,MSGL_WARN,MSGTR_VideoCodecFamilyNotAvailableStr, |
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
7124
diff
changeset
|
242 sh_video->codec->name, sh_video->codec->drv); |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
243 continue; |
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
244 } |
22012
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
245 orig_w = sh_video->bih ? sh_video->bih->biWidth : sh_video->disp_w; |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
246 orig_h = sh_video->bih ? sh_video->bih->biHeight : sh_video->disp_h; |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
247 sh_video->disp_w = orig_w; |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
248 sh_video->disp_h = orig_h; |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
249 // it's available, let's try to init! |
6566 | 250 if(sh_video->codec->flags & CODECS_FLAG_ALIGN16){ |
251 // align width/height to n*16 | |
252 sh_video->disp_w=(sh_video->disp_w+15)&(~15); | |
253 sh_video->disp_h=(sh_video->disp_h+15)&(~15); | |
22012
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
254 } |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
255 if (sh_video->bih) { |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
256 sh_video->bih->biWidth = sh_video->disp_w; |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
257 sh_video->bih->biHeight = sh_video->disp_h; |
6566 | 258 } |
259 // init() | |
6989 | 260 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_OpeningVideoDecoder,mpvdec->info->short_name,mpvdec->info->name); |
22405
1b1761cbba3b
Discard earlier failure in building filter chain when trying a new codec.
reimar
parents:
22086
diff
changeset
|
261 // clear vf init error, it is no longer relevant |
25962 | 262 if (sh_video->vf_initialized < 0) |
263 sh_video->vf_initialized = 0; | |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
264 if(!mpvdec->init(sh_video)){ |
6989 | 265 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_VDecoderInitFailed); |
22012
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
266 sh_video->disp_w=orig_w; |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
267 sh_video->disp_h=orig_h; |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
268 if (sh_video->bih) { |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
269 sh_video->bih->biWidth = sh_video->disp_w; |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
270 sh_video->bih->biHeight = sh_video->disp_h; |
213b5c14bba7
Implement FIXME: Restore original width/height when CODECS_FLAG_ALIGN16
reimar
parents:
20902
diff
changeset
|
271 } |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
272 continue; // try next... |
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
273 } |
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
274 // Yeah! We got it! |
25962 | 275 sh_video->initialized=1; |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
276 return 1; |
4902
7c4edfe929c8
implemented basic wrapper functions to new libmpcodecs api
arpi
parents:
4901
diff
changeset
|
277 } |
5171
7145d6aba6cd
init_video() changed - now it handles codec selection
arpi
parents:
5155
diff
changeset
|
278 return 0; |
1294 | 279 } |
280 | |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
281 int init_best_video_codec(sh_video_t *sh_video,char** video_codec_list,char** video_fm_list){ |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
282 char* vc_l_default[2]={"",(char*)NULL}; |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
283 stringset_t selected; |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
284 // hack: |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
285 if(!video_codec_list) video_codec_list=vc_l_default; |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
286 // Go through the codec.conf and find the best codec... |
25962 | 287 sh_video->initialized=0; |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
288 stringset_init(&selected); |
25962 | 289 while(!sh_video->initialized && *video_codec_list){ |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
290 char* video_codec=*(video_codec_list++); |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
291 if(video_codec[0]){ |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
292 if(video_codec[0]=='-'){ |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
293 // disable this codec: |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
294 stringset_add(&selected, video_codec+1); |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
295 } else { |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
296 // forced codec by name: |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
297 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_ForcedVideoCodec,video_codec); |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
298 init_video(sh_video,video_codec,NULL,-1, &selected); |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
299 } |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
300 } else { |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
301 int status; |
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
302 // try in stability order: UNTESTED, WORKING, BUGGY. never try CRASHING. |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
303 if(video_fm_list){ |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
304 char** fmlist=video_fm_list; |
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
305 // try first the preferred codec families: |
25962 | 306 while(!sh_video->initialized && *fmlist){ |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
307 char* video_fm=*(fmlist++); |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
308 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_TryForceVideoFmtStr,video_fm); |
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
309 for(status=CODECS_STATUS__MAX;status>=CODECS_STATUS__MIN;--status) |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
310 if(init_video(sh_video,NULL,video_fm,status, &selected)) break; |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
311 } |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
312 } |
25962 | 313 if(!sh_video->initialized) |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
314 for(status=CODECS_STATUS__MAX;status>=CODECS_STATUS__MIN;--status) |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
315 if(init_video(sh_video,NULL,NULL,status, &selected)) break; |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
316 } |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
317 } |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25326
diff
changeset
|
318 stringset_free(&selected); |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
319 |
25962 | 320 if(!sh_video->initialized){ |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
321 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CantFindVideoCodec,sh_video->format); |
10683 | 322 mp_msg(MSGT_DECAUDIO,MSGL_HINT, MSGTR_RTFMCodecs); |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
323 return 0; // failed |
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
324 } |
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
325 |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16325
diff
changeset
|
326 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_SelectedVideoCodec, |
7506
c1cb94198e05
-vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents:
7502
diff
changeset
|
327 sh_video->codec->name,sh_video->codec->drv,sh_video->codec->info); |
7502
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
328 return 1; // success |
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
329 } |
6a2b6f3d619c
best audio/video codec selection & init moved to libmpcodecs
arpi
parents:
7368
diff
changeset
|
330 |
22497 | 331 void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size, |
332 int drop_frame, double pts) | |
333 { | |
334 mp_image_t *mpi = NULL; | |
335 unsigned int t = GetTimer(); | |
336 unsigned int t2; | |
337 double tt; | |
1360 | 338 |
22498
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
339 if (correct_pts && pts != MP_NOPTS_VALUE) { |
22497 | 340 int delay = get_current_video_decoder_lag(sh_video); |
341 if (delay >= 0) { | |
342 if (delay > sh_video->num_buffered_pts) | |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
343 #if 0 |
22497 | 344 // this is disabled because vd_ffmpeg reports the same lag |
345 // after seek even when there are no buffered frames, | |
346 // leading to incorrect error messages | |
347 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Not enough buffered pts\n"); | |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
348 #else |
22497 | 349 ; |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
350 #endif |
22497 | 351 else |
352 sh_video->num_buffered_pts = delay; | |
353 } | |
354 if (sh_video->num_buffered_pts == | |
355 sizeof(sh_video->buffered_pts)/sizeof(double)) | |
356 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Too many buffered pts\n"); | |
357 else { | |
358 int i, j; | |
359 for (i = 0; i < sh_video->num_buffered_pts; i++) | |
360 if (sh_video->buffered_pts[i] < pts) | |
361 break; | |
362 for (j = sh_video->num_buffered_pts; j > i; j--) | |
363 sh_video->buffered_pts[j] = sh_video->buffered_pts[j-1]; | |
364 sh_video->buffered_pts[i] = pts; | |
365 sh_video->num_buffered_pts++; | |
366 } | |
367 } | |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
368 |
22497 | 369 mpi = mpvdec->decode(sh_video, start, in_size, drop_frame); |
4902
7c4edfe929c8
implemented basic wrapper functions to new libmpcodecs api
arpi
parents:
4901
diff
changeset
|
370 |
22497 | 371 //------------------------ frame decoded. -------------------- |
1294 | 372 |
19130
39d8fd7e7543
old 10l: do not try to compile mmx code if we do not have mmx
rfelker
parents:
18917
diff
changeset
|
373 #ifdef HAVE_MMX |
22497 | 374 // some codecs are broken, and doesn't restore MMX state :( |
375 // it happens usually with broken/damaged files. | |
376 if (gCpuCaps.has3DNow) { | |
3144 | 377 __asm __volatile ("femms\n\t":::"memory"); |
22497 | 378 } |
379 else if (gCpuCaps.hasMMX) { | |
3144 | 380 __asm __volatile ("emms\n\t":::"memory"); |
22497 | 381 } |
3160 | 382 #endif |
1367 | 383 |
22497 | 384 t2 = GetTimer(); t = t2-t; |
385 tt = t*0.000001f; | |
386 video_time_usage += tt; | |
4898 | 387 |
22497 | 388 if (!mpi || drop_frame) |
389 return NULL; // error / skipped frame | |
5040 | 390 |
22497 | 391 if (field_dominance == 0) |
392 mpi->fields |= MP_IMGFIELD_TOP_FIRST; | |
393 else if (field_dominance == 1) | |
394 mpi->fields &= ~MP_IMGFIELD_TOP_FIRST; | |
22086
8bf15e2ca61e
Add global field dominance flag instead of duplicating this "everywhere"
reimar
parents:
22012
diff
changeset
|
395 |
22497 | 396 if (correct_pts) { |
22498
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
397 if (sh_video->num_buffered_pts) { |
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
398 sh_video->num_buffered_pts--; |
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
399 sh_video->pts = sh_video->buffered_pts[sh_video->num_buffered_pts]; |
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
400 } |
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
401 else { |
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
402 mp_msg(MSGT_CPLAYER, MSGL_ERR, "No pts value from demuxer to " |
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
403 "use for frame!\n"); |
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
404 sh_video->pts = MP_NOPTS_VALUE; |
b6b1bd155b58
Allow demuxers to return packets with no pts in -correct-pts mode
uau
parents:
22497
diff
changeset
|
405 } |
22497 | 406 } |
407 return mpi; | |
20902
bfb6eacd9c4a
Update OSD contents only after the correct values for the frame are known.
uau
parents:
19521
diff
changeset
|
408 } |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18889
diff
changeset
|
409 |
22497 | 410 int filter_video(sh_video_t *sh_video, void *frame, double pts) |
411 { | |
412 mp_image_t *mpi = frame; | |
413 unsigned int t2 = GetTimer(); | |
414 vf_instance_t *vf = sh_video->vfilter; | |
415 // apply video filters and call the leaf vo/ve | |
416 int ret = vf->put_image(vf, mpi, pts); | |
417 if (ret > 0) { | |
418 vf->control(vf, VFCTRL_DRAW_OSD, NULL); | |
19521 | 419 #ifdef USE_ASS |
22497 | 420 vf->control(vf, VFCTRL_DRAW_EOSD, NULL); |
19521 | 421 #endif |
22497 | 422 } |
4898 | 423 |
22497 | 424 t2 = GetTimer()-t2; |
20902
bfb6eacd9c4a
Update OSD contents only after the correct values for the frame are known.
uau
parents:
19521
diff
changeset
|
425 vout_time_usage += t2*0.000001; |
1360 | 426 |
22497 | 427 return ret; |
1294 | 428 } |