annotate libmpdemux/video.c @ 27319:09cf111f68b8

Revert to previous dependency checking behavior. Take included header files into account when generating dependency files. This has problems when header files are removed or renamed, but does not silently miscompile files.
author diego
date Sat, 26 Jul 2008 18:36:48 +0000
parents 16beae919ff1
children d47744b95b78
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
1 // read video frame
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
2
2775
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
3 #include "config.h"
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
4
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
5 #include <stdio.h>
2775
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
6 #ifdef HAVE_MALLOC_H
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
7 #include <malloc.h>
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2567
diff changeset
8 #endif
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
9 #include <stdlib.h>
3726
1acf2f1f9dc8 missing #include's
pl
parents: 3666
diff changeset
10 #include <string.h>
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
11 #include <unistd.h>
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
12
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
13 #include "mp_msg.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
14 #include "help_mp.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
15
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 22173
diff changeset
16 #include "stream/stream.h"
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
17 #include "demuxer.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
18 #include "stheader.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
19 #include "parse_es.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
20 #include "mpeg_hdr.h"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
21
6784
b38e38b6f88f DVD Closed Captioning support, patch by Matteo Giani <matgiani@ctonet.it>, small changes by me.
atmos4
parents: 6571
diff changeset
22 /* sub_cc (closed captions)*/
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16505
diff changeset
23 #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
24
4774
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
25 /* biCompression constant */
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
26 #define BI_RGB 0L
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
27
18219
2ea5d88eacd4 Rename some forgotten #ifdef STREAMING_LIVE_DOT_COM to STREAMING_LIVE555.
diego
parents: 17960
diff changeset
28 #ifdef STREAMING_LIVE555
9457
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9221
diff changeset
29 #include "demux_rtp.h"
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9221
diff changeset
30 #endif
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9221
diff changeset
31
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
32 static mp_mpeg_header_t picture;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
33
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
34 static int telecine=0;
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
35 static float telecine_cnt=-2.5;
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
36
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
37 typedef enum {
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
38 VIDEO_MPEG12,
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
39 VIDEO_MPEG4,
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
40 VIDEO_H264,
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
41 VIDEO_VC1,
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
42 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
43 } 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
44
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
45 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
46 {
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
47 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
48 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
49
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
50 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
51 (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
52 (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
53 (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
54 (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
55 (
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
56 (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
57 ((! 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
58 ) ||
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
59 (fmt == DEMUXER_TYPE_MPEG_TY)
18219
2ea5d88eacd4 Rename some forgotten #ifdef STREAMING_LIVE_DOT_COM to STREAMING_LIVE555.
diego
parents: 17960
diff changeset
60 #ifdef STREAMING_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
61 || ((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
62 #endif
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
63 )
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
64 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
65 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
66 ((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
67 ((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
68 )
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 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
70 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
71 ((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
72 ((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
73 )
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
74 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
75 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
76 (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
77 return VIDEO_VC1;
26296
71ddd37be152 Do proper parsing for DVR-MS files, this fixes playback with ffmpeg decoder
reimar
parents: 26069
diff changeset
78 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
79 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
80 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
81 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
82 }
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
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 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
85 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
86 video_codec_t video_codec = find_video_codec(sh_video);
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
87 // 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
88 switch(video_codec){
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
89 case VIDEO_OTHER: {
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
90 if((d_video->demuxer->file_format == DEMUXER_TYPE_ASF) || (d_video->demuxer->file_format == DEMUXER_TYPE_AVI)) {
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
91 // display info:
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
92 // 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
93 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
94 sh_video->format=sh_video->bih->biCompression;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
95 sh_video->disp_w=sh_video->bih->biWidth;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
96 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
97 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
98 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
99 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
100 case VIDEO_MPEG4: {
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
101 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
102 videobuf_len=0; videobuf_code_len=0;
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
103 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
104 while(1){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
105 int i=sync_video_packet(d_video);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
106 if(i<=0x11F) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
107 if(!i || !skip_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
108 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
109 return 0;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
110 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
111 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
112 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
113 if(!videobuffer) {
27282
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
114 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
115 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
116 else {
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
117 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
118 return 0;
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
119 }
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
120 }
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 Layer 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);
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
124 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
125 if(i>=0x120 && i<=0x12F) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
126 if(!i || !read_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
127 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
128 return 0;
9069
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 }
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
131 pos = videobuf_len+4;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
132 if(!read_video_packet(d_video)){
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
133 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
134 return 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
135 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
136 mp4_header_process_vol(&picture, &(videobuffer[pos]));
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
137 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK! FPS SEEMS TO BE %.3f\nSearching for Video Object Plane Start code... ", sh_video->fps);
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
138 mp4_init:
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
139 while(1){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
140 int i=sync_video_packet(d_video);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
141 if(i==0x1B6) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
142 if(!i || !read_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
143 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
144 return 0;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
145 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
146 }
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
147 pos = videobuf_len+4;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
148 if(!read_video_packet(d_video)){
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
149 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
150 return 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
151 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
152 mp4_header_process_vop(&picture, &(videobuffer[pos]));
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
153 units[vop_cnt] = picture.timeinc_unit;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
154 vop_cnt++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
155 //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
156 if(!picture.fps) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
157 int i, mn, md, mx, diff;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
158 if(vop_cnt < 3)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
159 goto mp4_init;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
160
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
161 i=0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
162 mn = mx = units[0];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
163 for(i=0; i<3; i++) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
164 if(units[i] < mn)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
165 mn = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
166 if(units[i] > mx)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
167 mx = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
168 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
169 md = mn;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
170 for(i=0; i<3; i++) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
171 if((units[i] > mn) && (units[i] < mx))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
172 md = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
173 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
174 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
175 if(mx - md > md - mn)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
176 diff = md - mn;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
177 else
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
178 diff = mx - md;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
179 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
180 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
181 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
182 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
183 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
184 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
185 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
186 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
187 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
188 }
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
189 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
190 sh_video->format=0x10000004;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
191 break;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
192 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
193 case VIDEO_H264: {
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
194 int pos = 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
195 videobuf_len=0; videobuf_code_len=0;
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
196 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence parameter set... ");
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
197 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
198 int i=sync_video_packet(d_video);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
199 if((i&~0x60) == 0x107 && i != 0x107) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
200 if(!i || !skip_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
201 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
202 return 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
203 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
204 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
205 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
206 if(!videobuffer) {
27282
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
207 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
208 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
209 else {
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
210 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
211 return 0;
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
212 }
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
213 }
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
214 pos = videobuf_len+4;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
215 if(!read_video_packet(d_video)){
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
216 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
217 return 0;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
218 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
219 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
220 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for picture parameter set... ");
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
221 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
222 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
223 mp_msg(MSGT_DECVIDEO,MSGL_V,"H264: 0x%X\n",i);
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
224 if((i&~0x60) == 0x108 && i != 0x108) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
225 if(!i || !read_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
226 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
227 return 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
228 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
229 }
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
230 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\nSearching for Slice... ");
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
231 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
232 int i=sync_video_packet(d_video);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
233 if((i&~0x60) == 0x101 || (i&~0x60) == 0x102 || (i&~0x60) == 0x105) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
234 if(!i || !read_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
235 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
236 return 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
237 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
238 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
239 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
240 sh_video->format=0x10000005;
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
241 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
242 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
243 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
244 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
245 }
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
246 break;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
247 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
248 case VIDEO_MPEG12: {
26296
71ddd37be152 Do proper parsing for DVR-MS files, this fixes playback with ffmpeg decoder
reimar
parents: 26069
diff changeset
249 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
250 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
251 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
252 }
17277
c568f01ef9f9 search next sequence_header untile a valid one is found
nicodvb
parents: 17226
diff changeset
253 mpeg_header_parser:
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
254 // Find sequence_header first:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
255 videobuf_len=0; videobuf_code_len=0;
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
256 telecine=0; telecine_cnt=-2.5;
24838
a0181b13daf5 removed funny calls to fflush(stdout) after mp_msg()
nicodvb
parents: 24837
diff changeset
257 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence header... ");
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
258 while(1){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
259 int i=sync_video_packet(d_video);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
260 if(i==0x1B3) break; // found it!
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
261 if(!i || !skip_video_packet(d_video)){
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17343
diff changeset
262 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
263 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
264 return 0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
265 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
266 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
267 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
268 // ========= Read & process sequence header & extension ============
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
269 if(!videobuffer) {
27282
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
270 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
271 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
272 else {
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
273 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
274 return 0;
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
275 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
276 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
277
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
278 if(!read_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
279 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
280 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
281 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
282 if(mp_header_process_sequence_header (&picture, &videobuffer[4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
283 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
284 goto mpeg_header_parser;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
285 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
286 if(sync_video_packet(d_video)==0x1B5){ // next packet is seq. ext.
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
287 int pos=videobuf_len;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
288 if(!read_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
289 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
290 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
291 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
292 if(mp_header_process_extension (&picture, &videobuffer[pos+4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
293 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
294 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
295 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
296 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
297
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
298 // display info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
299 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
300 sh_video->fps=picture.fps;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
301 if(!sh_video->fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
302 sh_video->frametime=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
303 } 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
304 sh_video->frametime=1.0/picture.fps;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
305 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
306 sh_video->disp_w=picture.display_picture_width;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
307 sh_video->disp_h=picture.display_picture_height;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
308 // bitrate:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
309 if(picture.bitrate!=0x3FFFF) // unspecified/VBR ?
9606
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
310 sh_video->i_bps=picture.bitrate * 400 / 8;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
311 // info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
312 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
313 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
314 picture.mpeg1?"MPEG1":"MPEG2",
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
315 sh_video->disp_w,sh_video->disp_h,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
316 picture.aspect_ratio_information,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
317 sh_video->fps,
9606
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
318 sh_video->i_bps * 8 / 1000.0,
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
319 sh_video->i_bps / 1000.0 );
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
320 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
321 }
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
322 case VIDEO_VC1: {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
323 // Find sequence_header:
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
324 videobuf_len=0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
325 videobuf_code_len=0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
326 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
327 while(1){
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
328 int i=sync_video_packet(d_video);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
329 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
330 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
331 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
332 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
333 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
334 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
335 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
336 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
337 if(!videobuffer) {
27282
16beae919ff1 Avoid including avcodec.h in demuxer.h (and thus many other files) just to get
reimar
parents: 27269
diff changeset
338 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
339 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
340 else {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
341 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
342 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
343 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
344 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
345 if(!read_video_packet(d_video)){
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
346 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
347 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
348 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
349
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
350 while(1) {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
351 int i=sync_video_packet(d_video);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
352 if(i==0x10E) break; // found it!
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
353 if(!i || !skip_video_packet(d_video)){
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
354 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
355 return 0;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
356 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
357 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
358 if(!read_video_packet(d_video)){
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
359 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
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
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
363 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
364 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
365 if(sh_video->bih == NULL) {
58d083ace2f2 vc1 probing code: if sh_video->bih can't be callocated exit
nicodvb
parents: 21951
diff changeset
366 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
367 return 0;
58d083ace2f2 vc1 probing code: if sh_video->bih can't be callocated exit
nicodvb
parents: 21951
diff changeset
368 }
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
369 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
370 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
371 sh_video->bih->biCompression = sh_video->format;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
372 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
373 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
374 if(picture.fps > 0) {
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
375 sh_video->frametime=1.0/picture.fps;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
376 sh_video->fps = picture.fps;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
377 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
378 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
379 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
380 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
381 break;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
382 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
383 } // switch(file_format)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
384
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
385 return 1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
386 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
387
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
388 void ty_processuserdata( unsigned char* buf, int len );
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
389
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
390 static void process_userdata(unsigned char* buf,int len){
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
391 int i;
6791
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
392 /* if the user data starts with "CC", assume it is a CC info packet */
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
393 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
394 // 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
395 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
396 }
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
397 if( len > 2 && buf[ 0 ] == 'T' && buf[ 1 ] == 'Y' )
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
398 {
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
399 ty_processuserdata( buf + 2, len - 2 );
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
400 return;
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
401 }
7208
79fb883d9769 user-data moved one -v up
arpi
parents: 6910
diff changeset
402 if(verbose<2) return;
24839
69f5bb02b659 in process_userdata() move debugging messages from stdout to stderr
nicodvb
parents: 24838
diff changeset
403 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
404 len, buf[0], buf[1], buf[2], buf[3]);
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
405 for(i=0;i<len;i++)
24839
69f5bb02b659 in process_userdata() move debugging messages from stdout to stderr
nicodvb
parents: 24838
diff changeset
406 // 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
407 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
408 fprintf(stderr, "'\n");
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
409 }
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
410
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
411 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
412 demux_stream_t *d_video=sh_video->ds;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
413 demuxer_t *demuxer=d_video->demuxer;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
414 float frame_time=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
415 float pts1=d_video->pts;
8965
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
416 float pts=0;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
417 int picture_coding_type=0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
418 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
419 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
420
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
421 *start=NULL;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
422
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
423 if(video_codec == VIDEO_MPEG12){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
424 int in_frame=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
425 //float newfps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
426 //videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
427 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
428 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
429 //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
430 int start=videobuf_len+4;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
431 if(in_frame){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
432 if(i<0x101 || i>=0x1B0){ // not slice code -> end of frame
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
433 if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
434 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
435 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
436 } else {
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
437 if(i==0x100){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
438 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
439 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
440 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
441 if(i>=0x101 && i<0x1B0) in_frame=1; // picture startcode
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
442 else if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
443 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
444 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
445 // process headers:
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
446 switch(i){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
447 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
448 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
449 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
450 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
451 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
452 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
453
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
454 *start=videobuffer; in_size=videobuf_len;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
455
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
456 // 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
457 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
458 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
459 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
460 sh_video->frametime=1.0/picture.fps;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
461 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
462
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
463 // fix mpeg2 frametime:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
464 frame_time=(picture.display_time)*0.01f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
465 picture.display_time=100;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
466 videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
467
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
468 telecine_cnt*=0.9; // drift out error
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
469 telecine_cnt+=frame_time-5.0/4.0;
9221
arpi
parents: 9129
diff changeset
470 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
471
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
472 if(telecine){
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
473 frame_time=1;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
474 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
475 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
476 telecine=0;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
477 }
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
478 } else
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
479 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
480 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
481 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
482 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
483 telecine=1;
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
484 }
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
485 } else if(video_codec == VIDEO_MPEG4){
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
486 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
487 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
488 if(!i) return -1;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
489 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
490 if(i==0x1B6) break;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
491 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
492 *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
493 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
494 } else if(video_codec == VIDEO_H264){
16505
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
495 int in_picture = 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
496 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
497 int i=sync_video_packet(d_video);
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
498 int pos = videobuf_len+4;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
499 if(!i) return -1;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
500 if(!read_video_packet(d_video)) return -1; // EOF
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
501 if((i&~0x60) == 0x107 && i != 0x107) {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
502 h264_parse_sps(&picture, &(videobuffer[pos]), videobuf_len - pos);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
503 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
504 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
505 sh_video->frametime=1.0/picture.fps;
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
506 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
507 i=sync_video_packet(d_video);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
508 if(!i) return -1;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
509 if(!read_video_packet(d_video)) return -1; // EOF
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
510 }
16505
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
511
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
512 // here starts the access unit end detection code
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
513 // 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
514 // 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
515 // 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
516 // Message-ID: <20050917092406.GA7699@rz.uni-karlsruhe.de>
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
517 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
518 // 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
519 // picture, so start scanning for the end now
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
520 in_picture = 1;
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
521 if (in_picture) {
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
522 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
523 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
524 if(i == 0x101 || i == 0x102 || i == 0x105) {
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
525 // assuming arbitrary slice ordering is not allowed, the
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
526 // 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
527 // for the first VCL NAL in a picture
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
528 if (demux_peekc(d_video) & 0x80)
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
529 break;
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
530 }
cb6599e433d7 Fix H264 packetizer. Might not work with arbitrary slice order.
reimar
parents: 16314
diff changeset
531 }
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
532 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
533 *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
534 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
535 } else if(video_codec == VIDEO_VC1) {
21949
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
536 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
537 int i=sync_video_packet(d_video);
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
538 if(!i) return -1;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
539 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
540 if(i==0x10D) break;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
541 }
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
542 *start=videobuffer;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
543 in_size=videobuf_len;
202327a68635 decode vc1 sequence header and frame it in video_read_frame();
nicodvb
parents: 21809
diff changeset
544 videobuf_len=0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
545 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
546 // frame-based file formats: (AVI,ASF,MOV)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
547 in_size=ds_get_packet(d_video,start);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
548 if(in_size<0) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
549 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
550
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
551
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
552 //------------------------ frame decoded. --------------------
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
553
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
554 // Increase video timers:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
555 sh_video->num_frames+=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
556 ++sh_video->num_frames_decoded;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
557
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
558 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
559
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
560 // 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
561 if(!force_fps) switch(demuxer->file_format){
9693
1d598bf65571 10l, found by Jan Kritzner <kritzner@informatik.rwth-aachen.de>
alex
parents: 9610
diff changeset
562 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
563 case DEMUXER_TYPE_MATROSKA:
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
564 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
565 frame_time=d_video->pts-pts1;
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
566 break;
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
567 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
568 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
569 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
570 case DEMUXER_TYPE_VIVO:
19802
f1655de446c4 Support for variable fps OGM files, blessed by Moritz.
diego
parents: 19695
diff changeset
571 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
572 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
573 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
574 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
575 if(d>=0){
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
576 if(d>0){
19082
a2f20562aac3 Remove support for obsolete and non-free divx4/odivx libraries.
diego
parents: 18942
diff changeset
577 if((int)sh_video->fps==1000)
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
578 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
579 sh_video->frametime=d; // 1ms
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
580 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
581 }
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
582 frame_time = d;
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
583 } else {
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
584 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
585 // frame_time = 1/25.0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
586 }
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
587 }
9693
1d598bf65571 10l, found by Jan Kritzner <kritzner@informatik.rwth-aachen.de>
alex
parents: 9610
diff changeset
588 break;
12170
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
589 case DEMUXER_TYPE_LAVF:
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
590 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
591 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
592 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
593 if(d>=0){
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
594 frame_time = d;
24837
fdd2cf92f854 removed more empty spaces and empty lines
nicodvb
parents: 24836
diff changeset
595 }
12170
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
596 }
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
597 break;
18942
cf05a9897d1b Revert r18878, always sync rm files using only pts (ignore framerate)
rtogni
parents: 18873
diff changeset
598 case DEMUXER_TYPE_REAL:
cf05a9897d1b Revert r18878, always sync rm files using only pts (ignore framerate)
rtogni
parents: 18873
diff changeset
599 {
19695
782364fc00c4 Use better resolution for pts computation.
rtogni
parents: 19655
diff changeset
600 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
601 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
602
19655
bddd0b58efb6 Workaround for live Real streams starting with nonzero pts
rtogni
parents: 19082
diff changeset
603 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
604 }
cf05a9897d1b Revert r18878, always sync rm files using only pts (ignore framerate)
rtogni
parents: 18873
diff changeset
605 break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
606 }
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
607
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
608 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
609 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
610 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
611 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
612 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
613 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
614 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
615 } else {
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
616 if(pts){
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
617 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
618 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
619 }
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
620 }
8965
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
621 } else
24834
a8ef08f502c0 cosmetics: removed tabs/empty lines/trailing spaces and done a partial reformatting where desperately needed
nicodvb
parents: 24832
diff changeset
622 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
623
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
624 if(frame_time_ptr) *frame_time_ptr=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
625 return in_size;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
626 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
627