annotate libmpcodecs/dec_video.c @ 32282:606e4157cd4c

Split alloc and init of context so that parameters can be set in the context instead of requireing being passed through function parameters. This also makes sws work with AVOptions.
author michael
date Sun, 26 Sep 2010 19:33:57 +0000
parents dcdcbe7f6713
children d80bbc5868de
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30421
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
1 /*
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
2 * This file is part of MPlayer.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
3 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
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: 30378
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: 30378
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: 30378
diff changeset
7 * (at your option) any later version.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
8 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
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: 30378
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: 30378
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: 30378
diff changeset
12 * GNU General Public License for more details.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
13 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
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: 30378
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: 30378
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: 30378
diff changeset
17 */
2775
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2716
diff changeset
18
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2716
diff changeset
19 #include "config.h"
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
20
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
21 #include <stdio.h>
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
22 #include <stdlib.h>
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1429
diff changeset
23 #include <unistd.h>
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
24
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1547
diff changeset
25 #include "mp_msg.h"
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1949
diff changeset
26 #include "help_mp.h"
32061
dcdcbe7f6713 Move video_time_usage / vout_time_usage extern var declarations to mpcommon.h.
diego
parents: 31989
diff changeset
27 #include "mpcommon.h"
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
28
9380
edfe34c5405d linux->osdep
arpi
parents: 8152
diff changeset
29 #include "osdep/timer.h"
edfe34c5405d linux->osdep
arpi
parents: 8152
diff changeset
30 #include "osdep/shmem.h"
1327
b12e1817bcc2 some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents: 1309
diff changeset
31
22599
4faee1254928 Add explicit location for headers from the stream/ directory.
diego
parents: 22498
diff changeset
32 #include "stream/stream.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22599
diff changeset
33 #include "libmpdemux/demuxer.h"
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22599
diff changeset
34 #include "libmpdemux/parse_es.h"
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
35
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
36 #include "codec-cfg.h"
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
37
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
38 #include "libvo/video_out.h"
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
39
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22599
diff changeset
40 #include "libmpdemux/stheader.h"
4902
7c4edfe929c8 implemented basic wrapper functions to new libmpcodecs api
arpi
parents: 4901
diff changeset
41 #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
42 #include "vf.h"
31927
6e0b5a97e00f EOSD/ASS code factorization
cigaes
parents: 31246
diff changeset
43 #include "eosd.h"
4188
cfd1eed5961d using mp_image.h - not finished...
arpi
parents: 4156
diff changeset
44
2563
fc124f9db88e more cleanup, warnings fixed
arpi
parents: 2541
diff changeset
45 #include "dec_video.h"
fc124f9db88e more cleanup, warnings fixed
arpi
parents: 2541
diff changeset
46
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27341
diff changeset
47 #ifdef CONFIG_DYNAMIC_PLUGINS
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
48 #include <dlfcn.h>
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
49 #endif
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
50
3144
ce34f5b40272 runtime cpu detection
michael
parents: 3073
diff changeset
51 #include "cpudetect.h"
ce34f5b40272 runtime cpu detection
michael
parents: 3073
diff changeset
52
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
53 int field_dominance = -1;
22086
8bf15e2ca61e Add global field dominance flag instead of duplicating this "everywhere"
reimar
parents: 22012
diff changeset
54
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
55 int divx_quality = 0;
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
56
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
57 const vd_functions_t *mpvdec = NULL;
4902
7c4edfe929c8 implemented basic wrapper functions to new libmpcodecs api
arpi
parents: 4901
diff changeset
58
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
59 int get_video_quality_max(sh_video_t *sh_video)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
60 {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
61 vf_instance_t *vf = sh_video->vfilter;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
62 if (vf) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
63 int ret = vf->control(vf, VFCTRL_QUERY_MAX_PP_LEVEL, NULL);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
64 if (ret > 0) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
65 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_UsingExternalPP, ret);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
66 return ret;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
67 }
5519
868c13f78f08 vf control codes added, autoq support
arpi
parents: 5507
diff changeset
68 }
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
69 if (mpvdec) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
70 int ret = mpvdec->control(sh_video, VDCTRL_QUERY_MAX_PP_LEVEL, NULL);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
71 if (ret > 0) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
72 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_UsingCodecPP, ret);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
73 return ret;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
74 }
5519
868c13f78f08 vf control codes added, autoq support
arpi
parents: 5507
diff changeset
75 }
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5984
diff changeset
76 // mp_msg(MSGT_DECVIDEO,MSGL_INFO,"[PP] Sorry, postprocessing is not available\n");
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
77 return 0;
1429
8986d06b2816 contrast/brightness/etc patch (temporary)
arpi
parents: 1422
diff changeset
78 }
8986d06b2816 contrast/brightness/etc patch (temporary)
arpi
parents: 1422
diff changeset
79
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
80 void set_video_quality(sh_video_t *sh_video, int quality)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
81 {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
82 vf_instance_t *vf = sh_video->vfilter;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
83 if (vf) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
84 int ret = vf->control(vf, VFCTRL_SET_PP_LEVEL, (void *) (&quality));
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
85 if (ret == CONTROL_TRUE)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
86 return; // success
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
87 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
88 if (mpvdec)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
89 mpvdec->control(sh_video, VDCTRL_SET_PP_LEVEL, (void *) (&quality));
1429
8986d06b2816 contrast/brightness/etc patch (temporary)
arpi
parents: 1422
diff changeset
90 }
8986d06b2816 contrast/brightness/etc patch (temporary)
arpi
parents: 1422
diff changeset
91
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
92 int set_video_colors(sh_video_t *sh_video, const char *item, int value)
4395
817530449706 New logic of HW equalizing:
nick
parents: 4388
diff changeset
93 {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
94 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
95 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
96
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
97 data.item = item;
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
98 data.value = value;
6786
b16cb6cbff5a eq reworked
alex
parents: 6785
diff changeset
99
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
100 mp_dbg(MSGT_DECVIDEO, MSGL_V, "set video colors %s=%d \n", item, value);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
101 if (vf) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
102 int ret = vf->control(vf, VFCTRL_SET_EQUALIZER, &data);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
103 if (ret == CONTROL_TRUE)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
104 return 1;
6785
12dcd0f85262 fixed possible 10l bug (vf not initialized yet)
alex
parents: 6780
diff changeset
105 }
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
106 /* try software control */
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
107 if (mpvdec)
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
108 if (mpvdec->control(sh_video, VDCTRL_SET_EQUALIZER, item,
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
109 (int *) value) == CONTROL_OK)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
110 return 1;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
111 mp_msg(MSGT_DECVIDEO, MSGL_V, MSGTR_VideoAttributeNotSupportedByVO_VD,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
112 item);
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
113 return 0;
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
114 }
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
115
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
116 int get_video_colors(sh_video_t *sh_video, const char *item, int *value)
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
117 {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
118 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
119 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
120
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
121 data.item = item;
6786
b16cb6cbff5a eq reworked
alex
parents: 6785
diff changeset
122
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
123 mp_dbg(MSGT_DECVIDEO, MSGL_V, "get video colors %s \n", item);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
124 if (vf) {
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
125 int ret = vf->control(vf, VFCTRL_GET_EQUALIZER, &data);
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
126 if (ret == CONTROL_TRUE) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
127 *value = data.value;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
128 return 1;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
129 }
6786
b16cb6cbff5a eq reworked
alex
parents: 6785
diff changeset
130 }
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
131 /* try software control */
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
132 if (mpvdec)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
133 return mpvdec->control(sh_video, VDCTRL_GET_EQUALIZER, item, value);
1429
8986d06b2816 contrast/brightness/etc patch (temporary)
arpi
parents: 1422
diff changeset
134 return 0;
8986d06b2816 contrast/brightness/etc patch (temporary)
arpi
parents: 1422
diff changeset
135 }
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
136
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
137 int set_rectangle(sh_video_t *sh_video, int param, int value)
6887
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
138 {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
139 vf_instance_t *vf = sh_video->vfilter;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
140 int data[] = { param, value };
6887
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
141
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
142 mp_dbg(MSGT_DECVIDEO, MSGL_V, "set rectangle \n");
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
143 if (vf) {
6887
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
144 int ret = vf->control(vf, VFCTRL_CHANGE_RECTANGLE, data);
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
145 if (ret)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
146 return 1;
6887
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
147 }
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
148 return 0;
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
149 }
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
150
11977
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 10683
diff changeset
151 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
152 {
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
153 sh_video->timer = 0;
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
154 sh_video->next_frame_time = 0;
30378
8339bca8e4b4 Move the resync-related code into more consistent places instead of having it
reimar
parents: 29168
diff changeset
155 sh_video->num_buffered_pts = 0;
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
156 sh_video->last_pts = MP_NOPTS_VALUE;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
157 if (mpvdec)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
158 mpvdec->control(sh_video, VDCTRL_RESYNC_STREAM, NULL);
11977
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 10683
diff changeset
159 }
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 10683
diff changeset
160
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
161 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
162 {
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
163 int ret;
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
164
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
165 if (!mpvdec)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
166 return -1;
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
167 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
168 if (ret >= 10)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
169 return ret - 10;
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
170 return -1;
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
171 }
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
172
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
173 void uninit_video(sh_video_t *sh_video)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
174 {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
175 if (!sh_video->initialized)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
176 return;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
177 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
178 mpvdec->uninit(sh_video);
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27341
diff changeset
179 #ifdef CONFIG_DYNAMIC_PLUGINS
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
180 if (sh_video->dec_handle)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
181 dlclose(sh_video->dec_handle);
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
182 #endif
5737
de47aebf654c filters uninit
arpi
parents: 5643
diff changeset
183 vf_uninit_filter_chain(sh_video->vfilter);
31927
6e0b5a97e00f EOSD/ASS code factorization
cigaes
parents: 31246
diff changeset
184 eosd_uninit();
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
185 sh_video->initialized = 0;
1654
9d85b84e367e dec_video uninit
arpi
parents: 1653
diff changeset
186 }
9d85b84e367e dec_video uninit
arpi
parents: 1653
diff changeset
187
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
188 void vfm_help(void)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
189 {
7191
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
190 int i;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
191 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
192 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_DRIVERS\n");
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
193 mp_msg(MSGT_DECVIDEO, MSGL_INFO, " vfm: info: (comment)\n");
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
194 for (i = 0; mpcodecs_vd_drivers[i] != NULL; i++)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
195 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "%8s %s (%s)\n",
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
196 mpcodecs_vd_drivers[i]->info->short_name,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
197 mpcodecs_vd_drivers[i]->info->name,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
198 mpcodecs_vd_drivers[i]->info->comment);
7191
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
199 }
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
200
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
201 static int init_video(sh_video_t *sh_video, char *codecname, char *vfm,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
202 int status, stringset_t *selected)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
203 {
16325
attila
parents: 16321
diff changeset
204 int force = 0;
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
205 unsigned int orig_fourcc = sh_video->bih ? sh_video->bih->biCompression : 0;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
206 sh_video->codec = NULL;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
207 sh_video->vf_initialized = 0;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 15789
diff changeset
208 if (codecname && codecname[0] == '+') {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
209 codecname = &codecname[1];
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
210 force = 1;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 15789
diff changeset
211 }
6230
936aa617e829 restore original bih->biCompression if codec init failed
arpi
parents: 6138
diff changeset
212
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
213 while (1) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
214 int i;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
215 int orig_w, orig_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
216 // restore original fourcc:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
217 if (sh_video->bih)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
218 sh_video->bih->biCompression = orig_fourcc;
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
219 if (!(sh_video->codec =
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
220 find_video_codec(sh_video->format,
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
221 sh_video->bih ? ((unsigned int *) &sh_video->bih->biCompression) : NULL,
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
222 sh_video->codec, force)))
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
223 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
224 // ok we found one codec
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
225 if (stringset_test(selected, sh_video->codec->name))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
226 continue; // already tried & failed
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
227 if (codecname && strcmp(sh_video->codec->name, codecname))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
228 continue; // -vc
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
229 if (vfm && strcmp(sh_video->codec->drv, vfm))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
230 continue; // vfm doesn't match
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
231 if (!force && sh_video->codec->status < status)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
232 continue; // too unstable
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
233 stringset_add(selected, sh_video->codec->name); // tagging it
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
234 // ok, it matches all rules, let's find the driver!
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
235 for (i = 0; mpcodecs_vd_drivers[i] != NULL; i++)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
236 // if(mpcodecs_vd_drivers[i]->info->id==sh_video->codec->driver) break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
237 if (!strcmp
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
238 (mpcodecs_vd_drivers[i]->info->short_name,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
239 sh_video->codec->drv))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
240 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
241 mpvdec = mpcodecs_vd_drivers[i];
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27341
diff changeset
242 #ifdef CONFIG_DYNAMIC_PLUGINS
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
243 if (!mpvdec) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
244 /* try to open shared decoder plugin */
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
245 int buf_len;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
246 char *buf;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
247 vd_functions_t *funcs_sym;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
248 vd_info_t *info_sym;
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
249
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
250 buf_len = strlen(MPLAYER_LIBDIR) +
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
251 strlen(sh_video->codec->drv) + 16;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
252 buf = malloc(buf_len);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
253 if (!buf)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
254 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
255 snprintf(buf, buf_len, "%s/mplayer/vd_%s.so", MPLAYER_LIBDIR,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
256 sh_video->codec->drv);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
257 mp_msg(MSGT_DECVIDEO, MSGL_DBG2,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
258 "Trying to open external plugin: %s\n", buf);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
259 sh_video->dec_handle = dlopen(buf, RTLD_LAZY);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
260 if (!sh_video->dec_handle)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
261 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
262 snprintf(buf, buf_len, "mpcodecs_vd_%s", sh_video->codec->drv);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
263 funcs_sym = dlsym(sh_video->dec_handle, buf);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
264 if (!funcs_sym || !funcs_sym->info || !funcs_sym->init
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
265 || !funcs_sym->uninit || !funcs_sym->control
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
266 || !funcs_sym->decode)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
267 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
268 info_sym = funcs_sym->info;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
269 if (strcmp(info_sym->short_name, sh_video->codec->drv))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
270 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
271 free(buf);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
272 mpvdec = funcs_sym;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
273 mp_msg(MSGT_DECVIDEO, MSGL_V,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
274 "Using external decoder plugin (%s/mplayer/vd_%s.so)!\n",
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
275 MPLAYER_LIBDIR, sh_video->codec->drv);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
276 }
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
277 #endif
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
278 if (!mpvdec) { // driver not available (==compiled in)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
279 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
280 MSGTR_VideoCodecFamilyNotAvailableStr,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
281 sh_video->codec->name, sh_video->codec->drv);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
282 continue;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
283 }
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
284 orig_w = sh_video->bih ? sh_video->bih->biWidth : sh_video->disp_w;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
285 orig_h = sh_video->bih ? sh_video->bih->biHeight : sh_video->disp_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
286 sh_video->disp_w = orig_w;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
287 sh_video->disp_h = orig_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
288 // it's available, let's try to init!
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
289 if (sh_video->codec->flags & CODECS_FLAG_ALIGN16) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
290 // align width/height to n*16
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
291 sh_video->disp_w = (sh_video->disp_w + 15) & (~15);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
292 sh_video->disp_h = (sh_video->disp_h + 15) & (~15);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
293 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
294 if (sh_video->bih) {
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
295 sh_video->bih->biWidth = sh_video->disp_w;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
296 sh_video->bih->biHeight = sh_video->disp_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
297 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
298 // init()
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
299 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_OpeningVideoDecoder,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
300 mpvdec->info->short_name, mpvdec->info->name);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
301 // clear vf init error, it is no longer relevant
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
302 if (sh_video->vf_initialized < 0)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
303 sh_video->vf_initialized = 0;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
304 if (!mpvdec->init(sh_video)) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
305 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_VDecoderInitFailed);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
306 sh_video->disp_w = orig_w;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
307 sh_video->disp_h = orig_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
308 if (sh_video->bih) {
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
309 sh_video->bih->biWidth = sh_video->disp_w;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
310 sh_video->bih->biHeight = sh_video->disp_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
311 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
312 continue; // try next...
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
313 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
314 // Yeah! We got it!
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
315 sh_video->initialized = 1;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
316 return 1;
4902
7c4edfe929c8 implemented basic wrapper functions to new libmpcodecs api
arpi
parents: 4901
diff changeset
317 }
5171
7145d6aba6cd init_video() changed - now it handles codec selection
arpi
parents: 5155
diff changeset
318 return 0;
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
319 }
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
320
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
321 int init_best_video_codec(sh_video_t *sh_video, char **video_codec_list,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
322 char **video_fm_list)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
323 {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
324 char *vc_l_default[2] = { "", (char *) NULL };
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
325 stringset_t selected;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
326 // hack:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
327 if (!video_codec_list)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
328 video_codec_list = vc_l_default;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
329 // Go through the codec.conf and find the best codec...
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
330 sh_video->initialized = 0;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
331 stringset_init(&selected);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
332 while (!sh_video->initialized && *video_codec_list) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
333 char *video_codec = *(video_codec_list++);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
334 if (video_codec[0]) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
335 if (video_codec[0] == '-') {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
336 // disable this codec:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
337 stringset_add(&selected, video_codec + 1);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
338 } else {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
339 // forced codec by name:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
340 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_ForcedVideoCodec,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
341 video_codec);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
342 init_video(sh_video, video_codec, NULL, -1, &selected);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
343 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
344 } else {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
345 int status;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
346 // try in stability order: UNTESTED, WORKING, BUGGY. never try CRASHING.
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
347 if (video_fm_list) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
348 char **fmlist = video_fm_list;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
349 // try first the preferred codec families:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
350 while (!sh_video->initialized && *fmlist) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
351 char *video_fm = *(fmlist++);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
352 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_TryForceVideoFmtStr,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
353 video_fm);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
354 for (status = CODECS_STATUS__MAX;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
355 status >= CODECS_STATUS__MIN; --status)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
356 if (init_video
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
357 (sh_video, NULL, video_fm, status, &selected))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
358 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
359 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
360 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
361 if (!sh_video->initialized)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
362 for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
363 --status)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
364 if (init_video(sh_video, NULL, NULL, status, &selected))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
365 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
366 }
7506
c1cb94198e05 -vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents: 7502
diff changeset
367 }
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
368 stringset_free(&selected);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
369
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
370 if (!sh_video->initialized) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
371 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantFindVideoCodec,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
372 sh_video->format);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
373 return 0; // failed
7502
6a2b6f3d619c best audio/video codec selection & init moved to libmpcodecs
arpi
parents: 7368
diff changeset
374 }
6a2b6f3d619c best audio/video codec selection & init moved to libmpcodecs
arpi
parents: 7368
diff changeset
375
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
376 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_SelectedVideoCodec,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
377 sh_video->codec->name, sh_video->codec->drv, sh_video->codec->info);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
378 return 1; // success
7502
6a2b6f3d619c best audio/video codec selection & init moved to libmpcodecs
arpi
parents: 7368
diff changeset
379 }
6a2b6f3d619c best audio/video codec selection & init moved to libmpcodecs
arpi
parents: 7368
diff changeset
380
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
381 void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
31972
96559880e475 Improve A/V sync when not using -correct-pts.
cehoyos
parents: 31953
diff changeset
382 int drop_frame, double pts, int *full_frame)
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
383 {
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
384 mp_image_t *mpi = NULL;
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
385 unsigned int t = GetTimer();
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
386 unsigned int t2;
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
387 double tt;
31953
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
388 int delay;
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
389 int got_picture = 1;
1360
3ab0d3f21f51 some cleanup, redundant code removed
arpi
parents: 1352
diff changeset
390
31953
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
391 mpi = mpvdec->decode(sh_video, start, in_size, drop_frame);
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
392
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
393 //------------------------ frame decoded. --------------------
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
394
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
395 if (mpi && mpi->type == MP_IMGTYPE_INCOMPLETE) {
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
396 got_picture = 0;
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
397 mpi = NULL;
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
398 }
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
399
31972
96559880e475 Improve A/V sync when not using -correct-pts.
cehoyos
parents: 31953
diff changeset
400 if (full_frame)
96559880e475 Improve A/V sync when not using -correct-pts.
cehoyos
parents: 31953
diff changeset
401 *full_frame = got_picture;
96559880e475 Improve A/V sync when not using -correct-pts.
cehoyos
parents: 31953
diff changeset
402
31953
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
403 delay = get_current_video_decoder_lag(sh_video);
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
404 if (correct_pts && pts != MP_NOPTS_VALUE
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
405 && (got_picture || sh_video->num_buffered_pts < delay)) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
406 if (sh_video->num_buffered_pts ==
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
407 sizeof(sh_video->buffered_pts) / sizeof(double))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
408 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Too many buffered pts\n");
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
409 else {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
410 int i, j;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
411 for (i = 0; i < sh_video->num_buffered_pts; i++)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
412 if (sh_video->buffered_pts[i] < pts)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
413 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
414 for (j = sh_video->num_buffered_pts; j > i; j--)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
415 sh_video->buffered_pts[j] = sh_video->buffered_pts[j - 1];
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
416 sh_video->buffered_pts[i] = pts;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
417 sh_video->num_buffered_pts++;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
418 }
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
419 }
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
420
28290
25337a2147e7 Lots and lots of #ifdef ARCH_... -> #if ARCH_...
reimar
parents: 27757
diff changeset
421 #if HAVE_MMX
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
422 // some codecs are broken, and doesn't restore MMX state :(
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
423 // it happens usually with broken/damaged files.
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
424 if (gCpuCaps.has3DNow) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
425 __asm__ volatile ("femms\n\t":::"memory");
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
426 } else if (gCpuCaps.hasMMX) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
427 __asm__ volatile ("emms\n\t":::"memory");
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
428 }
3160
80df2986ca42 {f}emms is only needed on x86
jkeil
parents: 3144
diff changeset
429 #endif
1367
16bedc82bd09 MMX problem workaround for broken (win32) codecs
arpi
parents: 1365
diff changeset
430
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
431 t2 = GetTimer();
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
432 t = t2 - t;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
433 tt = t * 0.000001f;
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
434 video_time_usage += tt;
4898
a6b9c1fc6ee9 removed codec dependent parts, only core left
arpi
parents: 4881
diff changeset
435
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
436 if (!mpi || drop_frame)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
437 return NULL; // error / skipped frame
5040
568ca851a05b framedrop fix
arpi
parents: 5005
diff changeset
438
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
439 if (field_dominance == 0)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
440 mpi->fields |= MP_IMGFIELD_TOP_FIRST;
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
441 else if (field_dominance == 1)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
442 mpi->fields &= ~MP_IMGFIELD_TOP_FIRST;
22086
8bf15e2ca61e Add global field dominance flag instead of duplicating this "everywhere"
reimar
parents: 22012
diff changeset
443
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
444 if (correct_pts) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
445 if (sh_video->num_buffered_pts) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
446 sh_video->num_buffered_pts--;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
447 sh_video->pts = sh_video->buffered_pts[sh_video->num_buffered_pts];
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
448 } else {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
449 mp_msg(MSGT_CPLAYER, MSGL_ERR,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
450 "No pts value from demuxer to " "use for frame!\n");
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
451 sh_video->pts = MP_NOPTS_VALUE;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
452 }
31246
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
453 if (delay >= 0) {
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
454 // limit buffered pts only afterwards so we do not get confused
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
455 // by packets that produce no output (e.g. a single field of a
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
456 // H.264 frame).
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
457 if (delay > sh_video->num_buffered_pts)
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
458 #if 0
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
459 // this is disabled because vd_ffmpeg reports the same lag
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
460 // after seek even when there are no buffered frames,
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
461 // leading to incorrect error messages
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
462 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Not enough buffered pts\n");
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
463 #else
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
464 ;
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
465 #endif
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
466 else
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
467 sh_video->num_buffered_pts = delay;
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
468 }
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
469 }
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
470 return mpi;
20902
bfb6eacd9c4a Update OSD contents only after the correct values for the frame are known.
uau
parents: 19521
diff changeset
471 }
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
472
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
473 int filter_video(sh_video_t *sh_video, void *frame, double pts)
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
474 {
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
475 mp_image_t *mpi = frame;
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
476 unsigned int t2 = GetTimer();
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
477 vf_instance_t *vf = sh_video->vfilter;
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
478 // apply video filters and call the leaf vo/ve
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
479 int ret = vf->put_image(vf, mpi, pts);
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
480 if (ret > 0) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
481 // draw EOSD first so it ends up below the OSD.
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
482 // Note that changing this is will not work right with vf_ass and the
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
483 // vos currently always draw the EOSD first in paused mode.
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26754
diff changeset
484 #ifdef CONFIG_ASS
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
485 vf->control(vf, VFCTRL_DRAW_EOSD, NULL);
19521
0be2d3583f4f Add VFCTRL_DRAW_EOSD.
eugeni
parents: 19130
diff changeset
486 #endif
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
487 vf->control(vf, VFCTRL_DRAW_OSD, NULL);
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
488 }
4898
a6b9c1fc6ee9 removed codec dependent parts, only core left
arpi
parents: 4881
diff changeset
489
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
490 t2 = GetTimer() - t2;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
491 vout_time_usage += t2 * 0.000001;
1360
3ab0d3f21f51 some cleanup, redundant code removed
arpi
parents: 1352
diff changeset
492
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
493 return ret;
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
494 }