annotate libmpdemux/video.c @ 29507:fc8416cffdcd

Use a buffer of about half a second, instead of sizing it to have a constant number of frames. This improves the behaviour at very small or large sample rates, and gets rid of lots of obsolete code.
author cladisch
date Mon, 24 Aug 2009 07:32:25 +0000
parents 0f1b5b68af32
children 2b4de9979153
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
1 /*
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
2 * video frame reading
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
3 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
4 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
5 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
7 * it under the terms of the GNU General Public License as published by
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
9 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
10 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
14 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
15 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
16 * You should have received a copy of the GNU General Public License along
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28594
diff changeset
19 */
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
20
2775
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
21 #include "config.h"
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
22
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
23 #include <stdio.h>
28594
df67d03dde3b Convert HAVE_MALLOC_H into a 0/1 definition, fixes the warning:
diego
parents: 28018
diff changeset
24 #if HAVE_MALLOC_H
2775
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
25 #include <malloc.h>
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
26 #endif
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
27 #include <stdlib.h>
3726
1acf2f1f9dc8 missing #include's
pl
parents: 3666
diff changeset
28 #include <string.h>
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
29 #include <unistd.h>
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
30
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
31 #include "mp_msg.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
32 #include "help_mp.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
33
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 22173
diff changeset
34 #include "stream/stream.h"
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
35 #include "demuxer.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
36 #include "stheader.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
37 #include "parse_es.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
38 #include "mpeg_hdr.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
39
6784
b38e38b6f88f DVD Closed Captioning support, patch by Matteo Giani <matgiani@ctonet.it>, small changes by me.
atmos4
parents: 6571
diff changeset
40 /* sub_cc (closed captions)*/
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16505
diff changeset
41 #include "sub_cc.h"
6784
b38e38b6f88f DVD Closed Captioning support, patch by Matteo Giani <matgiani@ctonet.it>, small changes by me.
atmos4
parents: 6571
diff changeset
42
4774
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
43 /* biCompression constant */
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
44 #define BI_RGB 0L
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
45
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27282
diff changeset
46 #ifdef CONFIG_LIVE555
9457
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9221
diff changeset
47 #include "demux_rtp.h"
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9221
diff changeset
48 #endif
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9221
diff changeset
49
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
50 static mp_mpeg_header_t picture;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
51
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
52 static int telecine=0;
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
53 static float telecine_cnt=-2.5;
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
54
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
55 typedef enum {
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
56 VIDEO_MPEG12,
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
57 VIDEO_MPEG4,
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
58 VIDEO_H264,
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
59 VIDEO_VC1,
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
60 VIDEO_OTHER
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
61 } video_codec_t;
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
62
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
63 static video_codec_t find_video_codec(sh_video_t *sh_video)
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
64 {
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
65 demux_stream_t *d_video=sh_video->ds;
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
66 int fmt = d_video->demuxer->file_format;
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
67
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
68 if(
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
69 (fmt == DEMUXER_TYPE_PVA) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
70 (fmt == DEMUXER_TYPE_MPEG_ES) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
71 (fmt == DEMUXER_TYPE_MPEG_GXF) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
72 (fmt == DEMUXER_TYPE_MPEG_PES) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
73 (
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
74 (fmt == DEMUXER_TYPE_MPEG_PS || fmt == DEMUXER_TYPE_MPEG_TS) &&
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
75 ((! sh_video->format) || (sh_video->format==0x10000001) || (sh_video->format==0x10000002))
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
76 ) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
77 (fmt == DEMUXER_TYPE_MPEG_TY)
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27282
diff changeset
78 #ifdef CONFIG_LIVE555
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
79 || ((fmt == DEMUXER_TYPE_RTP) && demux_is_mpeg_rtp_stream(d_video->demuxer))
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
80 #endif
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
81 )
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
82 return VIDEO_MPEG12;
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
83 else if((fmt == DEMUXER_TYPE_MPEG4_ES) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
84 ((fmt == DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000004)) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
85 ((fmt == DEMUXER_TYPE_MPEG_PS) && (sh_video->format==0x10000004))
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
86 )
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
87 return VIDEO_MPEG4;
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
88 else if((fmt == DEMUXER_TYPE_H264_ES) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
89 ((fmt == DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000005)) ||
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
90 ((fmt == DEMUXER_TYPE_MPEG_PS) && (sh_video->format==0x10000005))
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
91 )
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
92 return VIDEO_H264;
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
93 else if((fmt == DEMUXER_TYPE_MPEG_PS || fmt == DEMUXER_TYPE_MPEG_TS) &&
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
94 (sh_video->format==mmioFOURCC('W', 'V', 'C', '1')))
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
95 return VIDEO_VC1;
26296
71ddd37be152 Do proper parsing for DVR-MS files, this fixes playback with ffmpeg decoder
reimar
parents: 26069
diff changeset
96 else if (fmt == DEMUXER_TYPE_ASF && sh_video->bih && sh_video->bih->biCompression == mmioFOURCC('D', 'V', 'R', ' '))
71ddd37be152 Do proper parsing for DVR-MS files, this fixes playback with ffmpeg decoder
reimar
parents: 26069
diff changeset
97 return VIDEO_MPEG12;
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
98 else
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
99 return VIDEO_OTHER;
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
100 }
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
101
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
102 int video_read_properties(sh_video_t *sh_video){
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
103 demux_stream_t *d_video=sh_video->ds;
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
104 video_codec_t video_codec = find_video_codec(sh_video);
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
105 // Determine image properties:
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
106 switch(video_codec){
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
107 case VIDEO_OTHER: {
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
108 if((d_video->demuxer->file_format == DEMUXER_TYPE_ASF) || (d_video->demuxer->file_format == DEMUXER_TYPE_AVI)) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
109 // display info:
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
110 // in case no strf chunk has been seen in avi, we have no bitmap header
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
111 if(!sh_video->bih) return 0;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
112 sh_video->format=sh_video->bih->biCompression;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
113 sh_video->disp_w=sh_video->bih->biWidth;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
114 sh_video->disp_h=abs(sh_video->bih->biHeight);
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
115 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
116 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
117 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
118 case VIDEO_MPEG4: {
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
119 int pos = 0, vop_cnt=0, units[3];
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
120 videobuf_len=0; videobuf_code_len=0;
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
121 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for Video Object Start code... ");
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
122 while(1){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
123 int i=sync_video_packet(d_video);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
124 if(i<=0x11F) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
125 if(!i || !skip_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
126 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
127 return 0;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
128 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
129 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
130 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
131 if(!videobuffer) {
27282
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
132 videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE + MP_INPUT_BUFFER_PADDING_SIZE);
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
133 if (videobuffer) memset(videobuffer+VIDEOBUFFER_SIZE, 0, MP_INPUT_BUFFER_PADDING_SIZE);
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
134 else {
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
135 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
136 return 0;
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
137 }
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
138 }
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
139 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for Video Object Layer Start code... ");
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
140 while(1){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
141 int i=sync_video_packet(d_video);
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
142 mp_msg(MSGT_DECVIDEO,MSGL_V,"M4V: 0x%X\n",i);
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
143 if(i>=0x120 && i<=0x12F) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
144 if(!i || !read_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
145 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
146 return 0;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
147 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
148 }
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
149 pos = videobuf_len+4;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
150 if(!read_video_packet(d_video)){
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
151 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Can't read Video Object Layer Header\n");
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
152 return 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
153 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
154 mp4_header_process_vol(&picture, &(videobuffer[pos]));
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
155 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK! FPS SEEMS TO BE %.3f\nSearching for Video Object Plane Start code... ", sh_video->fps);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
156 mp4_init:
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
157 while(1){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
158 int i=sync_video_packet(d_video);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
159 if(i==0x1B6) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
160 if(!i || !read_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
161 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
162 return 0;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
163 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
164 }
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
165 pos = videobuf_len+4;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
166 if(!read_video_packet(d_video)){
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
167 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Can't read Video Object Plane Header\n");
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
168 return 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
169 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
170 mp4_header_process_vop(&picture, &(videobuffer[pos]));
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
171 units[vop_cnt] = picture.timeinc_unit;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
172 vop_cnt++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
173 //mp_msg(MSGT_DECVIDEO,MSGL_V, "TYPE: %d, unit: %d\n", picture.picture_type, picture.timeinc_unit);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
174 if(!picture.fps) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
175 int i, mn, md, mx, diff;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
176 if(vop_cnt < 3)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
177 goto mp4_init;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
178
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
179 i=0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
180 mn = mx = units[0];
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
181 for(i=0; i<3; i++) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
182 if(units[i] < mn)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
183 mn = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
184 if(units[i] > mx)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
185 mx = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
186 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
187 md = mn;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
188 for(i=0; i<3; i++) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
189 if((units[i] > mn) && (units[i] < mx))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
190 md = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
191 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
192 mp_msg(MSGT_DECVIDEO,MSGL_V, "MIN: %d, mid: %d, max: %d\n", mn, md, mx);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
193 if(mx - md > md - mn)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
194 diff = md - mn;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
195 else
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
196 diff = mx - md;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
197 if(diff > 0){
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
198 picture.fps = ((float)picture.timeinc_resolution) / diff;
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
199 mp_msg(MSGT_DECVIDEO,MSGL_V, "FPS seems to be: %f, resolution: %d, delta_units: %d\n", picture.fps, picture.timeinc_resolution, diff);
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
200 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
201 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
202 if(picture.fps) {
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
203 sh_video->fps=picture.fps;
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
204 sh_video->frametime=1.0/picture.fps;
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
205 mp_msg(MSGT_DECVIDEO,MSGL_INFO, "FPS seems to be: %f\n", picture.fps);
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
206 }
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
207 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
208 sh_video->format=0x10000004;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
209 break;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
210 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
211 case VIDEO_H264: {
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
212 int pos = 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
213 videobuf_len=0; videobuf_code_len=0;
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
214 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence parameter set... ");
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
215 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
216 int i=sync_video_packet(d_video);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
217 if((i&~0x60) == 0x107 && i != 0x107) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
218 if(!i || !skip_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
219 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
220 return 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
221 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
222 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
223 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
224 if(!videobuffer) {
27282
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
225 videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE + MP_INPUT_BUFFER_PADDING_SIZE);
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
226 if (videobuffer) memset(videobuffer+VIDEOBUFFER_SIZE, 0, MP_INPUT_BUFFER_PADDING_SIZE);
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
227 else {
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
228 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
229 return 0;
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
230 }
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
231 }
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
232 pos = videobuf_len+4;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
233 if(!read_video_packet(d_video)){
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
234 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Can't read sequence parameter set\n");
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
235 return 0;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
236 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
237 h264_parse_sps(&picture, &(videobuffer[pos]), videobuf_len - pos);
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
238 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for picture parameter set... ");
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
239 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
240 int i=sync_video_packet(d_video);
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
241 mp_msg(MSGT_DECVIDEO,MSGL_V,"H264: 0x%X\n",i);
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
242 if((i&~0x60) == 0x108 && i != 0x108) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
243 if(!i || !read_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
244 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
245 return 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
246 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
247 }
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
248 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\nSearching for Slice... ");
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
249 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
250 int i=sync_video_packet(d_video);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
251 if((i&~0x60) == 0x101 || (i&~0x60) == 0x102 || (i&~0x60) == 0x105) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
252 if(!i || !read_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
253 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
254 return 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
255 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
256 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
257 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
258 sh_video->format=0x10000005;
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
259 if(picture.fps) {
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
260 sh_video->fps=picture.fps;
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
261 sh_video->frametime=1.0/picture.fps;
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
262 mp_msg(MSGT_DECVIDEO,MSGL_INFO, "FPS seems to be: %f\n", picture.fps);
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
263 }
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
264 break;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
265 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
266 case VIDEO_MPEG12: {
26296
71ddd37be152 Do proper parsing for DVR-MS files, this fixes playback with ffmpeg decoder
reimar
parents: 26069
diff changeset
267 if (d_video->demuxer->file_format == DEMUXER_TYPE_ASF) { // DVR-MS
71ddd37be152 Do proper parsing for DVR-MS files, this fixes playback with ffmpeg decoder
reimar
parents: 26069
diff changeset
268 if(!sh_video->bih) return 0;
71ddd37be152 Do proper parsing for DVR-MS files, this fixes playback with ffmpeg decoder
reimar
parents: 26069
diff changeset
269 sh_video->format=sh_video->bih->biCompression;
71ddd37be152 Do proper parsing for DVR-MS files, this fixes playback with ffmpeg decoder
reimar
parents: 26069
diff changeset
270 }
17277
c568f01ef9f9 search next sequence_header untile a valid one is found
nicodvb
parents: 17226
diff changeset
271 mpeg_header_parser:
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
272 // Find sequence_header first:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
273 videobuf_len=0; videobuf_code_len=0;
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
274 telecine=0; telecine_cnt=-2.5;
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
275 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence header... ");
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
276 while(1){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
277 int i=sync_video_packet(d_video);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
278 if(i==0x1B3) break; // found it!
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
279 if(!i || !skip_video_packet(d_video)){
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17343
diff changeset
280 if( mp_msg_test(MSGT_DECVIDEO,MSGL_V) ) mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
281 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MpegNoSequHdr);
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
282 return 0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
283 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
284 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
285 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
286 // ========= Read & process sequence header & extension ============
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
287 if(!videobuffer) {
27282
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
288 videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE + MP_INPUT_BUFFER_PADDING_SIZE);
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
289 if (videobuffer) memset(videobuffer+VIDEOBUFFER_SIZE, 0, MP_INPUT_BUFFER_PADDING_SIZE);
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
290 else {
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
291 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
292 return 0;
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
293 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
294 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
295
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
296 if(!read_video_packet(d_video)){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
297 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
298 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
299 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
300 if(mp_header_process_sequence_header (&picture, &videobuffer[4])) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
301 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdr);
17277
c568f01ef9f9 search next sequence_header untile a valid one is found
nicodvb
parents: 17226
diff changeset
302 goto mpeg_header_parser;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
303 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
304 if(sync_video_packet(d_video)==0x1B5){ // next packet is seq. ext.
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
305 int pos=videobuf_len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
306 if(!read_video_packet(d_video)){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
307 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
308 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
309 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
310 if(mp_header_process_extension (&picture, &videobuffer[pos+4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
311 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
312 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
313 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
314 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
315
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
316 // display info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
317 sh_video->format=picture.mpeg1?0x10000001:0x10000002; // mpeg video
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
318 sh_video->fps=picture.fps;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
319 if(!sh_video->fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
320 sh_video->frametime=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
321 } else {
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
322 sh_video->frametime=1.0/picture.fps;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
323 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
324 sh_video->disp_w=picture.display_picture_width;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
325 sh_video->disp_h=picture.display_picture_height;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
326 // bitrate:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
327 if(picture.bitrate!=0x3FFFF) // unspecified/VBR ?
9606
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
328 sh_video->i_bps=picture.bitrate * 400 / 8;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
329 // info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
330 mp_dbg(MSGT_DECVIDEO,MSGL_DBG2,"mpeg bitrate: %d (%X)\n",picture.bitrate,picture.bitrate);
10709
9ab19ded1b39 printing fps with 3 dec digit instead of 2
arpi
parents: 10687
diff changeset
331 mp_msg(MSGT_DECVIDEO,MSGL_INFO,"VIDEO: %s %dx%d (aspect %d) %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n",
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
332 picture.mpeg1?"MPEG1":"MPEG2",
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
333 sh_video->disp_w,sh_video->disp_h,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
334 picture.aspect_ratio_information,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
335 sh_video->fps,
9606
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
336 sh_video->i_bps * 8 / 1000.0,
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
337 sh_video->i_bps / 1000.0 );
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
338 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
339 }
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
340 case VIDEO_VC1: {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
341 // Find sequence_header:
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
342 videobuf_len=0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
343 videobuf_code_len=0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
344 mp_msg(MSGT_DECVIDEO,MSGL_INFO,"Searching for VC1 sequence header... ");
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
345 while(1){
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
346 int i=sync_video_packet(d_video);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
347 if(i==0x10F) break; // found it!
21951
bd3c871c93d0 in vc1 probing code, all packets before the first sequence header must be skipped, not read
nicodvb
parents: 21950
diff changeset
348 if(!i || !skip_video_packet(d_video)){
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
349 if( mp_msg_test(MSGT_DECVIDEO,MSGL_V) ) mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
350 mp_msg(MSGT_DECVIDEO,MSGL_ERR, "Couldn't find VC-1 sequence header\n");
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
351 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
352 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
353 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
354 mp_msg(MSGT_DECVIDEO,MSGL_INFO,"found\n");
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
355 if(!videobuffer) {
27282
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
356 videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE + MP_INPUT_BUFFER_PADDING_SIZE);
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
357 if (videobuffer) memset(videobuffer+VIDEOBUFFER_SIZE, 0, MP_INPUT_BUFFER_PADDING_SIZE);
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
358 else {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
359 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
360 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
361 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
362 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
363 if(!read_video_packet(d_video)){
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
364 mp_msg(MSGT_DECVIDEO,MSGL_ERR, "Couldn't read VC-1 sequence header!\n");
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
365 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
366 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
367
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
368 while(1) {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
369 int i=sync_video_packet(d_video);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
370 if(i==0x10E) break; // found it!
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
371 if(!i || !skip_video_packet(d_video)){
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
372 mp_msg(MSGT_DECVIDEO,MSGL_V,"Couldn't find VC-1 entry point sync-code:(\n");
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
373 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
374 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
375 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
376 if(!read_video_packet(d_video)){
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
377 mp_msg(MSGT_DECVIDEO,MSGL_V,"Couldn't read VC-1 entry point sync-code:(\n");
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
378 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
379 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
380
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
381 if(mp_vc1_decode_sequence_header(&picture, &videobuffer[4], videobuf_len-4)) {
21950
647f3be495eb removed unused variables; replaced wrong call to realloc() with calloc() in vc1 probing code
nicodvb
parents: 21949
diff changeset
382 sh_video->bih = (BITMAPINFOHEADER *) calloc(1, sizeof(BITMAPINFOHEADER) + videobuf_len);
21952
58d083ace2f2 vc1 probing code: if sh_video->bih can't be callocated exit
nicodvb
parents: 21951
diff changeset
383 if(sh_video->bih == NULL) {
58d083ace2f2 vc1 probing code: if sh_video->bih can't be callocated exit
nicodvb
parents: 21951
diff changeset
384 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Couldn't alloc %d bytes for VC-1 extradata!\n", sizeof(BITMAPINFOHEADER) + videobuf_len);
58d083ace2f2 vc1 probing code: if sh_video->bih can't be callocated exit
nicodvb
parents: 21951
diff changeset
385 return 0;
58d083ace2f2 vc1 probing code: if sh_video->bih can't be callocated exit
nicodvb
parents: 21951
diff changeset
386 }
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
387 sh_video->bih->biSize= sizeof(BITMAPINFOHEADER) + videobuf_len;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
388 memcpy(sh_video->bih + 1, videobuffer, videobuf_len);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
389 sh_video->bih->biCompression = sh_video->format;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
390 sh_video->bih->biWidth = sh_video->disp_w = picture.display_picture_width;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
391 sh_video->bih->biHeight = sh_video->disp_h = picture.display_picture_height;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
392 if(picture.fps > 0) {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
393 sh_video->frametime=1.0/picture.fps;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
394 sh_video->fps = picture.fps;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
395 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
396 mp_msg(MSGT_DECVIDEO,MSGL_INFO,"VIDEO: VC-1 %dx%d, %5.3f fps, header len: %d\n",
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
397 sh_video->disp_w, sh_video->disp_h, sh_video->fps, videobuf_len);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
398 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
399 break;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
400 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
401 } // switch(file_format)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
402
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
403 return 1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
404 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
405
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
406 void ty_processuserdata( unsigned char* buf, int len );
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
407
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
408 static void process_userdata(unsigned char* buf,int len){
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
409 int i;
6791
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
410 /* if the user data starts with "CC", assume it is a CC info packet */
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
411 if(len>2 && buf[0]=='C' && buf[1]=='C'){
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
412 // mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"video.c: process_userdata() detected Closed Captions!\n");
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
413 subcc_process_data(buf+2,len-2);
6784
b38e38b6f88f DVD Closed Captioning support, patch by Matteo Giani <matgiani@ctonet.it>, small changes by me.
atmos4
parents: 6571
diff changeset
414 }
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
415 if( len > 2 && buf[ 0 ] == 'T' && buf[ 1 ] == 'Y' )
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
416 {
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
417 ty_processuserdata( buf + 2, len - 2 );
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
418 return;
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
419 }
7208
79fb883d9769 user-data moved one -v up
arpi
parents: 6910
diff changeset
420 if(verbose<2) return;
24839
69f5bb02b659 in process_userdata() move debugging messages from stdout to stderr
nicodvb
parents: 24838
diff changeset
421 fprintf(stderr, "user_data: len=%3d %02X %02X %02X %02X '",
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
422 len, buf[0], buf[1], buf[2], buf[3]);
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
423 for(i=0;i<len;i++)
24839
69f5bb02b659 in process_userdata() move debugging messages from stdout to stderr
nicodvb
parents: 24838
diff changeset
424 // if(buf[i]>=32 && buf[i]<127) fputc(buf[i], stderr);
69f5bb02b659 in process_userdata() move debugging messages from stdout to stderr
nicodvb
parents: 24838
diff changeset
425 if(buf[i]&0x60) fputc(buf[i]&0x7F, stderr);
69f5bb02b659 in process_userdata() move debugging messages from stdout to stderr
nicodvb
parents: 24838
diff changeset
426 fprintf(stderr, "'\n");
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
427 }
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
428
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
429 int video_read_frame(sh_video_t* sh_video,float* frame_time_ptr,unsigned char** start,int force_fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
430 demux_stream_t *d_video=sh_video->ds;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
431 demuxer_t *demuxer=d_video->demuxer;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
432 float frame_time=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
433 float pts1=d_video->pts;
8965
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
434 float pts=0;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
435 int picture_coding_type=0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
436 int in_size=0;
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
437 video_codec_t video_codec = find_video_codec(sh_video);
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
438
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
439 *start=NULL;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
440
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
441 if(video_codec == VIDEO_MPEG12){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
442 int in_frame=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
443 //float newfps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
444 //videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
445 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
446 int i=sync_video_packet(d_video);
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
447 //void* buffer=&videobuffer[videobuf_len+4];
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
448 int start=videobuf_len+4;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
449 if(in_frame){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
450 if(i<0x101 || i>=0x1B0){ // not slice code -> end of frame
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
451 if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
452 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
453 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
454 } else {
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
455 if(i==0x100){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
456 pts=d_video->pts;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
457 d_video->pts=0;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
458 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
459 if(i>=0x101 && i<0x1B0) in_frame=1; // picture startcode
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
460 else if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
461 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
462 if(!read_video_packet(d_video)) return -1; // EOF
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
463 // process headers:
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
464 switch(i){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
465 case 0x1B3: mp_header_process_sequence_header (&picture, &videobuffer[start]);break;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
466 case 0x1B5: mp_header_process_extension (&picture, &videobuffer[start]);break;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
467 case 0x1B2: process_userdata (&videobuffer[start], videobuf_len-start);break;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
468 case 0x100: picture_coding_type=(videobuffer[start+1] >> 3) & 7;break;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
469 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
470 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
471
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
472 *start=videobuffer; in_size=videobuf_len;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
473
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
474 // get mpeg fps:
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
475 if(sh_video->fps!=picture.fps) if(!force_fps && !telecine){
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
476 mp_msg(MSGT_CPLAYER,MSGL_WARN,"Warning! FPS changed %5.3f -> %5.3f (%f) [%d] \n",sh_video->fps,picture.fps,sh_video->fps-picture.fps,picture.frame_rate_code);
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
477 sh_video->fps=picture.fps;
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
478 sh_video->frametime=1.0/picture.fps;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
479 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
480
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
481 // fix mpeg2 frametime:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
482 frame_time=(picture.display_time)*0.01f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
483 picture.display_time=100;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
484 videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
485
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
486 telecine_cnt*=0.9; // drift out error
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
487 telecine_cnt+=frame_time-5.0/4.0;
9221
arpi
parents: 9129
diff changeset
488 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"\r telecine = %3.1f %5.3f \n",frame_time,telecine_cnt);
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
489
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
490 if(telecine){
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
491 frame_time=1;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
492 if(telecine_cnt<-1.5 || telecine_cnt>1.5){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
493 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_LeaveTelecineMode);
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
494 telecine=0;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
495 }
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
496 } else
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
497 if(telecine_cnt>-0.5 && telecine_cnt<0.5 && !force_fps){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
498 sh_video->fps=sh_video->fps*4/5;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
499 sh_video->frametime=sh_video->frametime*5/4;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
500 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_EnterTelecineMode);
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
501 telecine=1;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
502 }
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
503 } else if(video_codec == VIDEO_MPEG4){
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
504 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
505 int i=sync_video_packet(d_video);
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
506 if(!i) return -1;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
507 if(!read_video_packet(d_video)) return -1; // EOF
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
508 if(i==0x1B6) break;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
509 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
510 *start=videobuffer; in_size=videobuf_len;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
511 videobuf_len=0;
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
512 } else if(video_codec == VIDEO_H264){
16505
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
513 int in_picture = 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
514 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
515 int i=sync_video_packet(d_video);
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
516 int pos = videobuf_len+4;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
517 if(!i) return -1;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
518 if(!read_video_packet(d_video)) return -1; // EOF
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
519 if((i&~0x60) == 0x107 && i != 0x107) {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
520 h264_parse_sps(&picture, &(videobuffer[pos]), videobuf_len - pos);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
521 if(picture.fps > 0) {
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
522 sh_video->fps=picture.fps;
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 14923
diff changeset
523 sh_video->frametime=1.0/picture.fps;
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
524 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
525 i=sync_video_packet(d_video);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
526 if(!i) return -1;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
527 if(!read_video_packet(d_video)) return -1; // EOF
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
528 }
16505
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
529
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
530 // here starts the access unit end detection code
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
531 // see the mail on MPlayer-dev-eng for details:
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
532 // Date: Sat, 17 Sep 2005 11:24:06 +0200
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
533 // Subject: Re: [MPlayer-dev-eng] [RFC] h264 ES parser problems
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
534 // Message-ID: <20050917092406.GA7699@rz.uni-karlsruhe.de>
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
535 if((i&~0x60) == 0x101 || (i&~0x60) == 0x102 || (i&~0x60) == 0x105)
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
536 // found VCL NAL with slice header i.e. start of current primary coded
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
537 // picture, so start scanning for the end now
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
538 in_picture = 1;
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
539 if (in_picture) {
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
540 i = sync_video_packet(d_video) & ~0x60; // code of next packet
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
541 if(i == 0x106 || i == 0x109) break; // SEI or access unit delim.
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
542 if(i == 0x101 || i == 0x102 || i == 0x105) {
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
543 // assuming arbitrary slice ordering is not allowed, the
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
544 // first_mb_in_slice (golomb encoded) value should be 0 then
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
545 // for the first VCL NAL in a picture
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
546 if (demux_peekc(d_video) & 0x80)
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
547 break;
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
548 }
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
549 }
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
550 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
551 *start=videobuffer; in_size=videobuf_len;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
552 videobuf_len=0;
24832
e0ae2a33857a cosmetics: moved to function find_video_codec() and reused in video_read_*() the code that identifies the various mpeg* formats
nicodvb
parents: 23752
diff changeset
553 } else if(video_codec == VIDEO_VC1) {
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
554 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE) {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
555 int i=sync_video_packet(d_video);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
556 if(!i) return -1;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
557 if(!read_video_packet(d_video)) return -1; // EOF
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
558 if(i==0x10D) break;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
559 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
560 *start=videobuffer;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
561 in_size=videobuf_len;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
562 videobuf_len=0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
563 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
564 // frame-based file formats: (AVI,ASF,MOV)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
565 in_size=ds_get_packet(d_video,start);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
566 if(in_size<0) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
567 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
568
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
569
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
570 //------------------------ frame decoded. --------------------
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
571
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
572 // Increase video timers:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
573 sh_video->num_frames+=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
574 ++sh_video->num_frames_decoded;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
575
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
576 frame_time*=sh_video->frametime;
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
577
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
578 // override frame_time for variable/unknown FPS formats:
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
579 if(!force_fps) switch(demuxer->file_format){
9693
1d598bf65571 10l, found by Jan Kritzner <kritzner@informatik.rwth-aachen.de>
alex
parents: 9610
diff changeset
580 case DEMUXER_TYPE_GIF:
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10263
diff changeset
581 case DEMUXER_TYPE_MATROSKA:
28018
4ac70bd6acac MNG demuxer by Stefan Schuermans, stefan blinkenarea org
diego
parents: 27457
diff changeset
582 case DEMUXER_TYPE_MNG:
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
583 if(d_video->pts>0 && pts1>0 && d_video->pts>pts1)
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
584 frame_time=d_video->pts-pts1;
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
585 break;
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
586 case DEMUXER_TYPE_TV:
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
587 case DEMUXER_TYPE_MOV:
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
588 case DEMUXER_TYPE_FILM:
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
589 case DEMUXER_TYPE_VIVO:
19802
f1655de446c4 Support for variable fps OGM files, blessed by Moritz.
diego
parents: 19695
diff changeset
590 case DEMUXER_TYPE_OGG:
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
591 case DEMUXER_TYPE_ASF: {
21809
2c473e083c70 Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents: 21236
diff changeset
592 double next_pts = ds_get_next_pts(d_video);
2c473e083c70 Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents: 21236
diff changeset
593 double d= (next_pts != MP_NOPTS_VALUE) ? next_pts - d_video->pts : d_video->pts-pts1;
6371
622d57683187 Fix asf stream wich were giving invalid frame times because the frame time
albeu
parents: 5930
diff changeset
594 if(d>=0){
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
595 if(d>0){
19082
a2f20562aac3 Remove support for obsolete and non-free divx4/odivx libraries.
diego
parents: 18942
diff changeset
596 if((int)sh_video->fps==1000)
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
597 mp_msg(MSGT_CPLAYER,MSGL_V,"\navg. framerate: %d fps \n",(int)(1.0f/d));
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
598 sh_video->frametime=d; // 1ms
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
599 sh_video->fps=1.0f/d;
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
600 }
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
601 frame_time = d;
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
602 } else {
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
603 mp_msg(MSGT_CPLAYER,MSGL_WARN,"\nInvalid frame duration value (%5.3f/%5.3f => %5.3f). Defaulting to %5.3f sec.\n",d_video->pts,next_pts,d,frame_time);
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
604 // frame_time = 1/25.0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
605 }
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
606 }
9693
1d598bf65571 10l, found by Jan Kritzner <kritzner@informatik.rwth-aachen.de>
alex
parents: 9610
diff changeset
607 break;
12170
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
608 case DEMUXER_TYPE_LAVF:
27457
16a2329e8776 handle the lavfpref demuxer in the same way as the lavf one
aurel
parents: 27397
diff changeset
609 case DEMUXER_TYPE_LAVF_PREFERRED:
12170
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
610 if((int)sh_video->fps==1000 || (int)sh_video->fps<=1){
21809
2c473e083c70 Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents: 21236
diff changeset
611 double next_pts = ds_get_next_pts(d_video);
2c473e083c70 Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents: 21236
diff changeset
612 double d= (next_pts != MP_NOPTS_VALUE) ? next_pts - d_video->pts : d_video->pts-pts1;
12170
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
613 if(d>=0){
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
614 frame_time = d;
24837
fdd2cf92f854 removed more empty spaces and empty lines
nicodvb
parents: 24836
diff changeset
615 }
12170
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
616 }
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
617 break;
18942
cf05a9897d1b Revert r18878, always sync rm files using only pts (ignore framerate)
rtogni
parents: 18873
diff changeset
618 case DEMUXER_TYPE_REAL:
cf05a9897d1b Revert r18878, always sync rm files using only pts (ignore framerate)
rtogni
parents: 18873
diff changeset
619 {
19695
782364fc00c4 Use better resolution for pts computation.
rtogni
parents: 19655
diff changeset
620 double next_pts = ds_get_next_pts(d_video);
21809
2c473e083c70 Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents: 21236
diff changeset
621 double d = (next_pts != MP_NOPTS_VALUE) ? next_pts - d_video->pts : d_video->pts - pts1;
18942
cf05a9897d1b Revert r18878, always sync rm files using only pts (ignore framerate)
rtogni
parents: 18873
diff changeset
622
19655
bddd0b58efb6 Workaround for live Real streams starting with nonzero pts
rtogni
parents: 19082
diff changeset
623 frame_time = (d >= 0 && pts1 > 0) ? d : 0.001;
18942
cf05a9897d1b Revert r18878, always sync rm files using only pts (ignore framerate)
rtogni
parents: 18873
diff changeset
624 }
cf05a9897d1b Revert r18878, always sync rm files using only pts (ignore framerate)
rtogni
parents: 18873
diff changeset
625 break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
626 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
627
24836
4e90fdb819b0 replaced giant if() with if(pre-calculated variable) (there was even a bug: PS doesn't necessarily contain mpeg12)
nicodvb
parents: 24834
diff changeset
628 if(video_codec == VIDEO_MPEG12){
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
629 sh_video->pts+=frame_time;
24912
384aa7179c9c in video_read_frame() set the keyframe flag in demuxer->video when dealing with
nicodvb
parents: 24850
diff changeset
630 if(picture_coding_type==1)
384aa7179c9c in video_read_frame() set the keyframe flag in demuxer->video when dealing with
nicodvb
parents: 24850
diff changeset
631 d_video->flags |= 1;
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
632 if(picture_coding_type<=2 && sh_video->i_pts){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
633 sh_video->pts=sh_video->i_pts;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
634 sh_video->i_pts=pts;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
635 } else {
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
636 if(pts){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
637 if(picture_coding_type<=2) sh_video->i_pts=pts;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
638 else sh_video->pts=pts;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
639 }
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
640 }
8965
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
641 } else
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
642 sh_video->pts=d_video->pts;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
643
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
644 if(frame_time_ptr) *frame_time_ptr=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
645 return in_size;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
646 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
647