annotate libmpcodecs/dec_video.c @ 36163:d13733fdf789

Avoid using swab() This is the only place where it is used and it is not available universally (missing e.g. on Android).
author reimar
date Thu, 09 May 2013 10:53:20 +0000
parents d29d116c0818
children 0d7459fc4354
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"
32460
d80bbc5868de Move eosd.[ch] to the sub directory.
cigaes
parents: 32061
diff changeset
43 #include "sub/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) {
33836
99982afd6dc5 dec_video: drop some unnecessary casts
diego
parents: 33827
diff changeset
84 int ret = vf->control(vf, VFCTRL_SET_PP_LEVEL, &quality);
31171
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)
33836
99982afd6dc5 dec_video: drop some unnecessary casts
diego
parents: 33827
diff changeset
89 mpvdec->control(sh_video, VDCTRL_SET_PP_LEVEL, &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;
33827
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32595
diff changeset
111 mp_msg(MSGT_DECVIDEO, MSGL_V,
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32595
diff changeset
112 "Video attribute '%s' is not supported by selected vo & vd.\n",
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
113 item);
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
114 return 0;
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
115 }
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
116
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
117 int get_video_colors(sh_video_t *sh_video, const char *item, int *value)
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
118 {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
119 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
120 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
121
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
122 data.item = item;
6786
b16cb6cbff5a eq reworked
alex
parents: 6785
diff changeset
123
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
124 mp_dbg(MSGT_DECVIDEO, MSGL_V, "get video colors %s \n", item);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
125 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
126 int ret = vf->control(vf, VFCTRL_GET_EQUALIZER, &data);
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
127 if (ret == CONTROL_TRUE) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
128 *value = data.value;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
129 return 1;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
130 }
6786
b16cb6cbff5a eq reworked
alex
parents: 6785
diff changeset
131 }
6780
5bf3ed8a17c4 equalizer reworked
alex
parents: 6566
diff changeset
132 /* try software control */
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
133 if (mpvdec)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
134 return mpvdec->control(sh_video, VDCTRL_GET_EQUALIZER, item, value);
1429
8986d06b2816 contrast/brightness/etc patch (temporary)
arpi
parents: 1422
diff changeset
135 return 0;
8986d06b2816 contrast/brightness/etc patch (temporary)
arpi
parents: 1422
diff changeset
136 }
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
137
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
138 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
139 {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
140 vf_instance_t *vf = sh_video->vfilter;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
141 int data[] = { param, value };
6887
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
142
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
143 mp_dbg(MSGT_DECVIDEO, MSGL_V, "set rectangle \n");
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
144 if (vf) {
6887
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
145 int ret = vf->control(vf, VFCTRL_CHANGE_RECTANGLE, data);
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
146 if (ret)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
147 return 1;
6887
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
148 }
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
149 return 0;
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
150 }
66427e850216 Add the control VFCTRL_CHANGE_RECTANGLE
kmkaplan
parents: 6832
diff changeset
151
11977
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 10683
diff changeset
152 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
153 {
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
154 sh_video->timer = 0;
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
155 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
156 sh_video->num_buffered_pts = 0;
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
157 sh_video->last_pts = MP_NOPTS_VALUE;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
158 if (mpvdec)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
159 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
160 }
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 10683
diff changeset
161
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
162 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
163 {
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
164 int ret;
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
165
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
166 if (!mpvdec)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
167 return -1;
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
168 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
169 if (ret >= 10)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
170 return ret - 10;
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
171 return -1;
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
172 }
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
173
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
174 void uninit_video(sh_video_t *sh_video)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
175 {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
176 if (!sh_video->initialized)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
177 return;
33827
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32595
diff changeset
178 mp_msg(MSGT_DECVIDEO, MSGL_V, "Uninit video: %s\n", sh_video->codec->drv);
4902
7c4edfe929c8 implemented basic wrapper functions to new libmpcodecs api
arpi
parents: 4901
diff changeset
179 mpvdec->uninit(sh_video);
32595
fc443754da3d Reset mpvdec to NULL after uninit.
reimar
parents: 32523
diff changeset
180 mpvdec = NULL;
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27341
diff changeset
181 #ifdef CONFIG_DYNAMIC_PLUGINS
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
182 if (sh_video->dec_handle)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
183 dlclose(sh_video->dec_handle);
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
184 #endif
5737
de47aebf654c filters uninit
arpi
parents: 5643
diff changeset
185 vf_uninit_filter_chain(sh_video->vfilter);
31927
6e0b5a97e00f EOSD/ASS code factorization
cigaes
parents: 31246
diff changeset
186 eosd_uninit();
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
187 sh_video->initialized = 0;
1654
9d85b84e367e dec_video uninit
arpi
parents: 1653
diff changeset
188 }
9d85b84e367e dec_video uninit
arpi
parents: 1653
diff changeset
189
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
190 void vfm_help(void)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
191 {
7191
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
192 int i;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
193 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
194 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_DRIVERS\n");
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
195 mp_msg(MSGT_DECVIDEO, MSGL_INFO, " vfm: info: (comment)\n");
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
196 for (i = 0; mpcodecs_vd_drivers[i] != NULL; i++)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
197 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "%8s %s (%s)\n",
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
198 mpcodecs_vd_drivers[i]->info->short_name,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
199 mpcodecs_vd_drivers[i]->info->name,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
200 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
201 }
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
202
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
203 static int init_video(sh_video_t *sh_video, char *codecname, char *vfm,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
204 int status, stringset_t *selected)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
205 {
16325
attila
parents: 16321
diff changeset
206 int force = 0;
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
207 unsigned int orig_fourcc = sh_video->bih ? sh_video->bih->biCompression : 0;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
208 sh_video->codec = NULL;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
209 sh_video->vf_initialized = 0;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 15789
diff changeset
210 if (codecname && codecname[0] == '+') {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
211 codecname = &codecname[1];
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
212 force = 1;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 15789
diff changeset
213 }
6230
936aa617e829 restore original bih->biCompression if codec init failed
arpi
parents: 6138
diff changeset
214
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
215 while (1) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
216 int i;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
217 int orig_w, orig_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
218 // restore original fourcc:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
219 if (sh_video->bih)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
220 sh_video->bih->biCompression = orig_fourcc;
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
221 if (!(sh_video->codec =
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
222 find_video_codec(sh_video->format,
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
223 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
224 sh_video->codec, force)))
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
225 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
226 // ok we found one codec
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
227 if (stringset_test(selected, sh_video->codec->name))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
228 continue; // already tried & failed
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
229 if (codecname && strcmp(sh_video->codec->name, codecname))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
230 continue; // -vc
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
231 if (vfm && strcmp(sh_video->codec->drv, vfm))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
232 continue; // vfm doesn't match
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
233 if (!force && sh_video->codec->status < status)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
234 continue; // too unstable
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
235 stringset_add(selected, sh_video->codec->name); // tagging it
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
236 // ok, it matches all rules, let's find the driver!
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
237 for (i = 0; mpcodecs_vd_drivers[i] != NULL; i++)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
238 // if(mpcodecs_vd_drivers[i]->info->id==sh_video->codec->driver) break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
239 if (!strcmp
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
240 (mpcodecs_vd_drivers[i]->info->short_name,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
241 sh_video->codec->drv))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
242 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
243 mpvdec = mpcodecs_vd_drivers[i];
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27341
diff changeset
244 #ifdef CONFIG_DYNAMIC_PLUGINS
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
245 if (!mpvdec) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
246 /* try to open shared decoder plugin */
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
247 int buf_len;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
248 char *buf;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
249 vd_functions_t *funcs_sym;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
250 vd_info_t *info_sym;
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
251
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
252 buf_len = strlen(MPLAYER_LIBDIR) +
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
253 strlen(sh_video->codec->drv) + 16;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
254 buf = malloc(buf_len);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
255 if (!buf)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
256 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
257 snprintf(buf, buf_len, "%s/mplayer/vd_%s.so", MPLAYER_LIBDIR,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
258 sh_video->codec->drv);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
259 mp_msg(MSGT_DECVIDEO, MSGL_DBG2,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
260 "Trying to open external plugin: %s\n", buf);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
261 sh_video->dec_handle = dlopen(buf, RTLD_LAZY);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
262 if (!sh_video->dec_handle)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
263 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
264 snprintf(buf, buf_len, "mpcodecs_vd_%s", sh_video->codec->drv);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
265 funcs_sym = dlsym(sh_video->dec_handle, buf);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
266 if (!funcs_sym || !funcs_sym->info || !funcs_sym->init
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
267 || !funcs_sym->uninit || !funcs_sym->control
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
268 || !funcs_sym->decode)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
269 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
270 info_sym = funcs_sym->info;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
271 if (strcmp(info_sym->short_name, sh_video->codec->drv))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
272 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
273 free(buf);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
274 mpvdec = funcs_sym;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
275 mp_msg(MSGT_DECVIDEO, MSGL_V,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
276 "Using external decoder plugin (%s/mplayer/vd_%s.so)!\n",
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
277 MPLAYER_LIBDIR, sh_video->codec->drv);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
278 }
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
279 #endif
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
280 if (!mpvdec) { // driver not available (==compiled in)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
281 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
282 MSGTR_VideoCodecFamilyNotAvailableStr,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
283 sh_video->codec->name, sh_video->codec->drv);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
284 continue;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
285 }
35304
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34311
diff changeset
286 /* only allow dummy codecs if specified via -vc */
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34311
diff changeset
287 if (sh_video->codec->flags & CODECS_FLAG_DUMMY && !codecname) {
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34311
diff changeset
288 continue;
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34311
diff changeset
289 }
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34311
diff changeset
290
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
291 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
292 orig_h = sh_video->bih ? sh_video->bih->biHeight : sh_video->disp_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
293 sh_video->disp_w = orig_w;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
294 sh_video->disp_h = orig_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
295 // it's available, let's try to init!
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
296 if (sh_video->codec->flags & CODECS_FLAG_ALIGN16) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
297 // align width/height to n*16
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
298 sh_video->disp_w = (sh_video->disp_w + 15) & (~15);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
299 sh_video->disp_h = (sh_video->disp_h + 15) & (~15);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
300 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
301 if (sh_video->bih) {
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
302 sh_video->bih->biWidth = sh_video->disp_w;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
303 sh_video->bih->biHeight = sh_video->disp_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
304 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
305 // init()
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
306 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_OpeningVideoDecoder,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
307 mpvdec->info->short_name, mpvdec->info->name);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
308 // clear vf init error, it is no longer relevant
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
309 if (sh_video->vf_initialized < 0)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
310 sh_video->vf_initialized = 0;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
311 if (!mpvdec->init(sh_video)) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
312 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_VDecoderInitFailed);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
313 sh_video->disp_w = orig_w;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
314 sh_video->disp_h = orig_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
315 if (sh_video->bih) {
31989
e648473842bd cosmetics: Repair some of the damage that 'indent' caused.
diego
parents: 31972
diff changeset
316 sh_video->bih->biWidth = sh_video->disp_w;
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
317 sh_video->bih->biHeight = sh_video->disp_h;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
318 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
319 continue; // try next...
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
320 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
321 // Yeah! We got it!
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
322 sh_video->initialized = 1;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
323 return 1;
4902
7c4edfe929c8 implemented basic wrapper functions to new libmpcodecs api
arpi
parents: 4901
diff changeset
324 }
5171
7145d6aba6cd init_video() changed - now it handles codec selection
arpi
parents: 5155
diff changeset
325 return 0;
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
326 }
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
327
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
328 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
329 char **video_fm_list)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
330 {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
331 char *vc_l_default[2] = { "", (char *) NULL };
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
332 stringset_t selected;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
333 // hack:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
334 if (!video_codec_list)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
335 video_codec_list = vc_l_default;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
336 // Go through the codec.conf and find the best codec...
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
337 sh_video->initialized = 0;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
338 stringset_init(&selected);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
339 while (!sh_video->initialized && *video_codec_list) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
340 char *video_codec = *(video_codec_list++);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
341 if (video_codec[0]) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
342 if (video_codec[0] == '-') {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
343 // disable this codec:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
344 stringset_add(&selected, video_codec + 1);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
345 } else {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
346 // forced codec by name:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
347 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_ForcedVideoCodec,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
348 video_codec);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
349 init_video(sh_video, video_codec, NULL, -1, &selected);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
350 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
351 } else {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
352 int status;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
353 // try in stability order: UNTESTED, WORKING, BUGGY. never try CRASHING.
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
354 if (video_fm_list) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
355 char **fmlist = video_fm_list;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
356 // try first the preferred codec families:
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
357 while (!sh_video->initialized && *fmlist) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
358 char *video_fm = *(fmlist++);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
359 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_TryForceVideoFmtStr,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
360 video_fm);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
361 for (status = CODECS_STATUS__MAX;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
362 status >= CODECS_STATUS__MIN; --status)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
363 if (init_video
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
364 (sh_video, NULL, video_fm, 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 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
367 }
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
368 if (!sh_video->initialized)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
369 for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
370 --status)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
371 if (init_video(sh_video, NULL, NULL, status, &selected))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
372 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
373 }
7506
c1cb94198e05 -vc/-vfm accepts codec/driver _list_ now. empty list element for -vc means
arpi
parents: 7502
diff changeset
374 }
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
375 stringset_free(&selected);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
376
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
377 if (!sh_video->initialized) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
378 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantFindVideoCodec,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
379 sh_video->format);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
380 return 0; // failed
7502
6a2b6f3d619c best audio/video codec selection & init moved to libmpcodecs
arpi
parents: 7368
diff changeset
381 }
6a2b6f3d619c best audio/video codec selection & init moved to libmpcodecs
arpi
parents: 7368
diff changeset
382
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
383 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_SelectedVideoCodec,
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
384 sh_video->codec->name, sh_video->codec->drv, sh_video->codec->info);
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
385 return 1; // success
7502
6a2b6f3d619c best audio/video codec selection & init moved to libmpcodecs
arpi
parents: 7368
diff changeset
386 }
6a2b6f3d619c best audio/video codec selection & init moved to libmpcodecs
arpi
parents: 7368
diff changeset
387
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
388 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
389 int drop_frame, double pts, int *full_frame)
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
390 {
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
391 mp_image_t *mpi = NULL;
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
392 unsigned int t = GetTimer();
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
393 unsigned int t2;
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
394 double tt;
31953
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
395 int delay;
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
396 int got_picture = 1;
1360
3ab0d3f21f51 some cleanup, redundant code removed
arpi
parents: 1352
diff changeset
397
31953
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
398 mpi = mpvdec->decode(sh_video, start, in_size, drop_frame);
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
399
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
400 //------------------------ frame decoded. --------------------
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
401
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
402 if (mpi && mpi->type == MP_IMGTYPE_INCOMPLETE) {
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
403 got_picture = 0;
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
404 mpi = NULL;
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
405 }
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
406
31972
96559880e475 Improve A/V sync when not using -correct-pts.
cehoyos
parents: 31953
diff changeset
407 if (full_frame)
96559880e475 Improve A/V sync when not using -correct-pts.
cehoyos
parents: 31953
diff changeset
408 *full_frame = got_picture;
96559880e475 Improve A/V sync when not using -correct-pts.
cehoyos
parents: 31953
diff changeset
409
31953
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
410 delay = get_current_video_decoder_lag(sh_video);
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
411 if (correct_pts && pts != MP_NOPTS_VALUE
2b390c08ed07 Improve correct-pts with PAFF streams.
cehoyos
parents: 31927
diff changeset
412 && (got_picture || sh_video->num_buffered_pts < delay)) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
413 if (sh_video->num_buffered_pts ==
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
414 sizeof(sh_video->buffered_pts) / sizeof(double))
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
415 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Too many buffered pts\n");
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
416 else {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
417 int i, j;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
418 for (i = 0; i < sh_video->num_buffered_pts; i++)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
419 if (sh_video->buffered_pts[i] < pts)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
420 break;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
421 for (j = sh_video->num_buffered_pts; j > i; j--)
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
422 sh_video->buffered_pts[j] = sh_video->buffered_pts[j - 1];
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
423 sh_video->buffered_pts[i] = pts;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
424 sh_video->num_buffered_pts++;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
425 }
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
426 }
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
427
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
428 // some codecs are broken, and doesn't restore MMX state :(
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
429 // it happens usually with broken/damaged files.
34311
cdee75826a31 Make emms/femms code simpler/more obvious.
reimar
parents: 33836
diff changeset
430 if (HAVE_AMD3DNOW && gCpuCaps.has3DNow) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
431 __asm__ volatile ("femms\n\t":::"memory");
34311
cdee75826a31 Make emms/femms code simpler/more obvious.
reimar
parents: 33836
diff changeset
432 } else if (HAVE_MMX && gCpuCaps.hasMMX) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
433 __asm__ volatile ("emms\n\t":::"memory");
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
434 }
1367
16bedc82bd09 MMX problem workaround for broken (win32) codecs
arpi
parents: 1365
diff changeset
435
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
436 t2 = GetTimer();
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
437 t = t2 - t;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
438 tt = t * 0.000001f;
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
439 video_time_usage += tt;
4898
a6b9c1fc6ee9 removed codec dependent parts, only core left
arpi
parents: 4881
diff changeset
440
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
441 if (!mpi || drop_frame)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
442 return NULL; // error / skipped frame
5040
568ca851a05b framedrop fix
arpi
parents: 5005
diff changeset
443
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
444 if (field_dominance == 0)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
445 mpi->fields |= MP_IMGFIELD_TOP_FIRST;
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
446 else if (field_dominance == 1)
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
447 mpi->fields &= ~MP_IMGFIELD_TOP_FIRST;
22086
8bf15e2ca61e Add global field dominance flag instead of duplicating this "everywhere"
reimar
parents: 22012
diff changeset
448
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
449 if (correct_pts) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
450 if (sh_video->num_buffered_pts) {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
451 sh_video->num_buffered_pts--;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
452 sh_video->pts = sh_video->buffered_pts[sh_video->num_buffered_pts];
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
453 } else {
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
454 mp_msg(MSGT_CPLAYER, MSGL_ERR,
32523
42ab538db6b0 Merge pointlessly split string.
reimar
parents: 32460
diff changeset
455 "No pts value from demuxer to use for frame!\n");
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
456 sh_video->pts = MP_NOPTS_VALUE;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
457 }
31246
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
458 if (delay >= 0) {
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
459 // 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
460 // 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
461 // H.264 frame).
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
462 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
463 #if 0
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
464 // 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
465 // 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
466 // leading to incorrect error messages
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
467 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
468 #else
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
469 ;
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
470 #endif
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
471 else
cc6ee3017097 Limit buffered PTS only when we actually got a frame from the decoder.
reimar
parents: 31171
diff changeset
472 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
473 }
22497
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 return mpi;
20902
bfb6eacd9c4a Update OSD contents only after the correct values for the frame are known.
uau
parents: 19521
diff changeset
476 }
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18889
diff changeset
477
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
478 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
479 {
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
480 mp_image_t *mpi = frame;
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
481 unsigned int t2 = GetTimer();
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
482 vf_instance_t *vf = sh_video->vfilter;
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
483 // apply video filters and call the leaf vo/ve
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
484 int ret = vf->put_image(vf, mpi, pts);
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
485 if (ret > 0) {
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
486 // draw EOSD first so it ends up below the OSD.
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
487 // 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
488 // vos currently always draw the EOSD first in paused mode.
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26754
diff changeset
489 #ifdef CONFIG_ASS
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
490 vf->control(vf, VFCTRL_DRAW_EOSD, NULL);
19521
0be2d3583f4f Add VFCTRL_DRAW_EOSD.
eugeni
parents: 19130
diff changeset
491 #endif
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
492 vf->control(vf, VFCTRL_DRAW_OSD, NULL);
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
493 }
4898
a6b9c1fc6ee9 removed codec dependent parts, only core left
arpi
parents: 4881
diff changeset
494
31171
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
495 t2 = GetTimer() - t2;
fe3b2b2a085f cosmetics: K&R coding style
diego
parents: 30692
diff changeset
496 vout_time_usage += t2 * 0.000001;
1360
3ab0d3f21f51 some cleanup, redundant code removed
arpi
parents: 1352
diff changeset
497
22497
af2ea92641a8 Reindent messy functions before working on them
uau
parents: 22405
diff changeset
498 return ret;
1294
0a8e0c7ddd0c video decoder stuff
arpi
parents:
diff changeset
499 }