annotate libmpdemux/video.c @ 15344:6a7adf41e4fe

Support for new vssh dll, patch by adland Use new dll only for new files, it can't decode old files (patch by me)
author rtognimp
date Wed, 04 May 2005 20:35:21 +0000
parents 658fc109eefc
children 04dd5945fab8
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
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
16 #include "stream.h"
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)*/
b38e38b6f88f DVD Closed Captioning support, patch by Matteo Giani <matgiani@ctonet.it>, small changes by me.
atmos4
parents: 6571
diff changeset
23 #include "../sub_cc.h"
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
9457
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9221
diff changeset
28 #ifdef STREAMING_LIVE_DOT_COM
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
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
37 int video_read_properties(sh_video_t *sh_video){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
38 demux_stream_t *d_video=sh_video->ds;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
39
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
40 enum {
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
41 VIDEO_MPEG12,
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
42 VIDEO_MPEG4,
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
43 VIDEO_H264,
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
44 VIDEO_OTHER
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
45 } video_codec;
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
46
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
47 if((d_video->demuxer->file_format == DEMUXER_TYPE_PVA) ||
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
48 (d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_ES) ||
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
49 (d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_PS && ((! sh_video->format) || (sh_video->format==0x10000001) || (sh_video->format==0x10000002))) ||
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
50 (d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TY) ||
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
51 (d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TS && ((sh_video->format==0x10000001) || (sh_video->format==0x10000002)))
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
52 #ifdef STREAMING_LIVE_DOT_COM
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
53 || ((d_video->demuxer->file_format == DEMUXER_TYPE_RTP) && demux_is_mpeg_rtp_stream(d_video->demuxer))
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
54 #endif
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
55 )
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
56 video_codec = VIDEO_MPEG12;
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
57 else if((d_video->demuxer->file_format == DEMUXER_TYPE_MPEG4_ES) ||
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
58 ((d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000004)) ||
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
59 ((d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_PS) && (sh_video->format==0x10000004))
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
60 )
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
61 video_codec = VIDEO_MPEG4;
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
62 else if((d_video->demuxer->file_format == DEMUXER_TYPE_H264_ES) ||
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
63 ((d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000005)) ||
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
64 ((d_video->demuxer->file_format == 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
65 )
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
66 video_codec = VIDEO_H264;
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
67 else
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
68 video_codec = VIDEO_OTHER;
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
69
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
70 // 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
71 switch(video_codec){
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
72 case VIDEO_OTHER: {
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
73 if((d_video->demuxer->file_format == DEMUXER_TYPE_ASF) || (d_video->demuxer->file_format == DEMUXER_TYPE_AVI)) {
4774
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
74 // display info:
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
75
5898
31202ff6fb3d ugly workaround disabled
arpi
parents: 5573
diff changeset
76 #if 0
4774
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
77 if(sh_video->bih->biCompression == BI_RGB &&
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
78 (sh_video->video.fccHandler == mmioFOURCC('D', 'I', 'B', ' ') ||
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
79 sh_video->video.fccHandler == mmioFOURCC('R', 'G', 'B', ' ') ||
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
80 sh_video->video.fccHandler == mmioFOURCC('R', 'A', 'W', ' ') ||
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
81 sh_video->video.fccHandler == 0)) {
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
82 sh_video->format = mmioFOURCC(0, 'R', 'G', 'B') | sh_video->bih->biBitCount;
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
83 }
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
84 else
5898
31202ff6fb3d ugly workaround disabled
arpi
parents: 5573
diff changeset
85 #endif
4774
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
86 sh_video->format=sh_video->bih->biCompression;
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
87
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
88 sh_video->disp_w=sh_video->bih->biWidth;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
89 sh_video->disp_h=abs(sh_video->bih->biHeight);
3980
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
90
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
91 #if 1
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
92 /* hack to support decoding of mpeg1 chunks in AVI's with libmpeg2 -- 2002 alex */
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
93 if ((sh_video->format == 0x10000001) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
94 (sh_video->format == 0x10000002) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
95 (sh_video->format == mmioFOURCC('m','p','g','1')) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
96 (sh_video->format == mmioFOURCC('M','P','G','1')) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
97 (sh_video->format == mmioFOURCC('m','p','g','2')) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
98 (sh_video->format == mmioFOURCC('M','P','G','2')) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
99 (sh_video->format == mmioFOURCC('m','p','e','g')) ||
7302
7d32189dbae4 typo (checking for mpeg twice, instead of mpeg & MPEG)
michael
parents: 7208
diff changeset
100 (sh_video->format == mmioFOURCC('M','P','E','G')))
3980
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
101 {
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
102 int saved_pos, saved_type;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
103
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
104 /* demuxer pos saving is required for libavcodec mpeg decoder as it's
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
105 reading the mpeg header self! */
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
106
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
107 saved_pos = d_video->buffer_pos;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
108 saved_type = d_video->demuxer->file_format;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
109
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
110 d_video->demuxer->file_format = DEMUXER_TYPE_MPEG_ES;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
111 video_read_properties(sh_video);
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
112 d_video->demuxer->file_format = saved_type;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
113 d_video->buffer_pos = saved_pos;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
114 // goto mpeg_header_parser;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
115 }
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
116 #endif
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
117 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
118 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
119 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
120 case VIDEO_MPEG4: {
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
121 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
122 videobuf_len=0; videobuf_code_len=0;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
123 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for Video Object Start code... ");fflush(stdout);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
124 while(1){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
125 int i=sync_video_packet(d_video);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
126 if(i<=0x11F) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
127 if(!i || !skip_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
128 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
129 return 0;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
130 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
131 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
132 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
133 if(!videobuffer) videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
134 if(!videobuffer){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
135 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
136 return 0;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
137 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
138 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for Video Object Layer Start code... ");fflush(stdout);
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);
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
141 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
142 if(i>=0x120 && i<=0x12F) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
143 if(!i || !read_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
144 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
145 return 0;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
146 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
147 }
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
148 pos = videobuf_len+4;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
149 if(!read_video_packet(d_video)){
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
150 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
151 return 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
152 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
153 mp4_header_process_vol(&picture, &(videobuffer[pos]));
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
154 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK! FPS SEEMS TO BE %.3f\nSearching for Video Object Plane Start code... ", sh_video->fps);fflush(stdout);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
155 mp4_init:
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
156 while(1){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
157 int i=sync_video_packet(d_video);
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
158 if(i==0x1B6) break; // found it!
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
159 if(!i || !read_video_packet(d_video)){
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
160 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
161 return 0;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
162 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
163 }
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
164 pos = videobuf_len+4;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
165 if(!read_video_packet(d_video)){
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
166 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
167 return 0;
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 mp4_header_process_vop(&picture, &(videobuffer[pos]));
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
170 units[vop_cnt] = picture.timeinc_unit;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
171 vop_cnt++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
172 //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
173 if(!picture.fps) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
174 int i, mn, md, mx, diff;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
175 if(vop_cnt < 3)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
176 goto mp4_init;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
177
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
178 i=0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
179 mn = mx = units[0];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
180 for(i=0; i<3; i++) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
181 if(units[i] < mn)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
182 mn = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
183 if(units[i] > mx)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
184 mx = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
185 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
186 md = mn;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
187 for(i=0; i<3; i++) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
188 if((units[i] > mn) && (units[i] < mx))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
189 md = units[i];
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
190 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
191 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
192 if(mx - md > md - mn)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
193 diff = md - mn;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
194 else
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
195 diff = mx - md;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
196 if(diff > 0){
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
197 picture.fps = (picture.timeinc_resolution * 10000) / diff;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
198 mp_msg(MSGT_DECVIDEO,MSGL_V, "FPS seems to be: %d/10000, resolution: %d, delta_units: %d\n", picture.fps, picture.timeinc_resolution, diff);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
199 }
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 if(picture.fps) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
202 sh_video->fps=picture.fps*0.0001f;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
203 sh_video->frametime=10000.0f/(float)picture.fps;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
204 mp_msg(MSGT_DECVIDEO,MSGL_INFO, "FPS seems to be: %d/10000\n", picture.fps);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 14034
diff changeset
205 }
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
206 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
207 sh_video->format=0x10000004;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
208 break;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
209 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
210 case VIDEO_H264: {
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
211 int pos = 0;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
212 videobuf_len=0; videobuf_code_len=0;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
213 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence parameter set... ");fflush(stdout);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
214 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
215 int i=sync_video_packet(d_video);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
216 if((i&~0x60) == 0x107 && i != 0x107) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
217 if(!i || !skip_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
218 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
219 return 0;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
220 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
221 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
222 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
223 if(!videobuffer) videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
224 if(!videobuffer){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
225 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
226 return 0;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
227 }
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
228 pos = videobuf_len+4;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
229 if(!read_video_packet(d_video)){
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
230 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
231 return 0;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
232 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
233 h264_parse_sps(&picture, &(videobuffer[pos]), videobuf_len - pos);
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
234 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for picture parameter set... ");fflush(stdout);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
235 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
236 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
237 mp_msg(MSGT_DECVIDEO,MSGL_V,"H264: 0x%X\n",i);
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
238 if((i&~0x60) == 0x108 && i != 0x108) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
239 if(!i || !read_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
240 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
241 return 0;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
242 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
243 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
244 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\nSearching for Slice... ");fflush(stdout);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
245 while(1){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
246 int i=sync_video_packet(d_video);
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
247 if((i&~0x60) == 0x101 || (i&~0x60) == 0x102 || (i&~0x60) == 0x105) break; // found it!
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
248 if(!i || !read_video_packet(d_video)){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
249 mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
250 return 0;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
251 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
252 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
253 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
254 sh_video->format=0x10000005;
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
255 if(picture.fps) {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
256 sh_video->fps=picture.fps*0.0001f;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
257 sh_video->frametime=10000.0f/(float)picture.fps;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
258 mp_msg(MSGT_DECVIDEO,MSGL_INFO, "FPS seems to be: %d/10000\n", picture.fps);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
259 }
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
260 break;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
261 }
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
262 case VIDEO_MPEG12: {
3980
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
263 //mpeg_header_parser:
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
264 // Find sequence_header first:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
265 videobuf_len=0; videobuf_code_len=0;
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
266 telecine=0; telecine_cnt=-2.5;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
267 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence header... ");fflush(stdout);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
268 while(1){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
269 int i=sync_video_packet(d_video);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
270 if(i==0x1B3) break; // found it!
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
271 if(!i || !skip_video_packet(d_video)){
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7465
diff changeset
272 if(verbose>0) mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
273 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MpegNoSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
274 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
275 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
276 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
277 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
278 // sh_video=d_video->sh;sh_video->ds=d_video;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
279 // mpeg2_init();
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
280 // ========= Read & process sequence header & extension ============
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
281 if(!videobuffer) videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
282 if(!videobuffer){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
283 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
284 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
285 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
286
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
287 if(!read_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
288 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
289 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
290 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
291 if(mp_header_process_sequence_header (&picture, &videobuffer[4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
292 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
293 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
294 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
295 if(sync_video_packet(d_video)==0x1B5){ // next packet is seq. ext.
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
296 // videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
297 int pos=videobuf_len;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
298 if(!read_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
299 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
300 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
301 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
302 if(mp_header_process_extension (&picture, &videobuffer[pos+4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
303 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
304 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
305 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
306 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
307
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
308 // printf("picture.fps=%d\n",picture.fps);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
309
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
310 // fill aspect info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
311 switch(picture.aspect_ratio_information){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
312 case 2: // PAL/NTSC SVCD/DVD 4:3
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
313 case 8: // PAL VCD 4:3
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
314 case 12: // NTSC VCD 4:3
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
315 sh_video->aspect=4.0/3.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
316 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
317 case 3: // PAL/NTSC Widescreen SVCD/DVD 16:9
3666
70c409621d92 Add aspect 6, anamorphic 16:9 for svcd
atmos4
parents: 3526
diff changeset
318 case 6: // (PAL?)/NTSC Widescreen SVCD 16:9
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
319 sh_video->aspect=16.0/9.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
320 break;
11833
aa8807bd062d fix aspect 4 according to the standart
iive
parents: 11385
diff changeset
321 case 4: // according to ISO-138182-2 Table 6.3
aa8807bd062d fix aspect 4 according to the standart
iive
parents: 11385
diff changeset
322 sh_video->aspect=2.21;
aa8807bd062d fix aspect 4 according to the standart
iive
parents: 11385
diff changeset
323 break;
4336
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
324 case 9: // Movie Type ??? / 640x480
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
325 sh_video->aspect=0.0;
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
326 break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
327 default:
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
328 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Detected unknown aspect_ratio_information in mpeg sequence header.\n"
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
329 "Please report the aspect value (%i) along with the movie type (VGA,PAL,NTSC,"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
330 "SECAM) and the movie resolution (720x576,352x240,480x480,...) to the MPlayer"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
331 " developers, so that we can add support for it!\nAssuming 1:1 aspect for now.\n",
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
332 picture.aspect_ratio_information);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
333 case 1: // VGA 1:1 - do not prescale
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
334 sh_video->aspect=0.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
335 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
336 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
337 // display info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
338 sh_video->format=picture.mpeg1?0x10000001:0x10000002; // mpeg video
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
339 sh_video->fps=picture.fps*0.0001f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
340 if(!sh_video->fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
341 // if(!force_fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
342 // fprintf(stderr,"FPS not specified (or invalid) in the header! Use the -fps option!\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
343 // return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
344 // }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
345 sh_video->frametime=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
346 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
347 sh_video->frametime=10000.0f/(float)picture.fps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
348 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
349 sh_video->disp_w=picture.display_picture_width;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
350 sh_video->disp_h=picture.display_picture_height;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
351 // bitrate:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
352 if(picture.bitrate!=0x3FFFF) // unspecified/VBR ?
9606
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
353 sh_video->i_bps=picture.bitrate * 400 / 8;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
354 // info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
355 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
356 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
357 picture.mpeg1?"MPEG1":"MPEG2",
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
358 sh_video->disp_w,sh_video->disp_h,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
359 picture.aspect_ratio_information,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
360 sh_video->fps,
9606
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
361 sh_video->i_bps * 8 / 1000.0,
0197c1e933fe This patch corrects the calculation of the MPEG bitrate from the
arpi
parents: 9457
diff changeset
362 sh_video->i_bps / 1000.0 );
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
363 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
364 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
365 } // switch(file_format)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
366
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
367 return 1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
368 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
369
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
370 void ty_processuserdata( unsigned char* buf, int len );
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
371
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
372 static void process_userdata(unsigned char* buf,int len){
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
373 int i;
6791
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
374 /* if the user data starts with "CC", assume it is a CC info packet */
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
375 if(len>2 && buf[0]=='C' && buf[1]=='C'){
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
376 // mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"video.c: process_userdata() detected Closed Captions!\n");
6784
b38e38b6f88f DVD Closed Captioning support, patch by Matteo Giani <matgiani@ctonet.it>, small changes by me.
atmos4
parents: 6571
diff changeset
377 if(subcc_enabled) subcc_process_data(buf+2,len-2);
b38e38b6f88f DVD Closed Captioning support, patch by Matteo Giani <matgiani@ctonet.it>, small changes by me.
atmos4
parents: 6571
diff changeset
378 }
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
379 if( len > 2 && buf[ 0 ] == 'T' && buf[ 1 ] == 'Y' )
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
380 {
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
381 ty_processuserdata( buf + 2, len - 2 );
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
382 return;
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
383 }
7208
79fb883d9769 user-data moved one -v up
arpi
parents: 6910
diff changeset
384 if(verbose<2) return;
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
385 printf( "user_data: len=%3d %02X %02X %02X %02X '",
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
386 len, buf[0], buf[1], buf[2], buf[3]);
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
387 for(i=0;i<len;i++)
6791
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
388 // if(buf[i]>=32 && buf[i]<127) putchar(buf[i]);
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
389 if(buf[i]&0x60) putchar(buf[i]&0x7F);
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
390 printf("'\n");
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
391 }
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
392
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
393 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
394 demux_stream_t *d_video=sh_video->ds;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
395 demuxer_t *demuxer=d_video->demuxer;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
396 float frame_time=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
397 float pts1=d_video->pts;
8965
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
398 float pts=0;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
399 int picture_coding_type=0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
400 // unsigned char* start=NULL;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
401 int in_size=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
402
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
403 *start=NULL;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
404
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
405 if(demuxer->file_format==DEMUXER_TYPE_MPEG_ES ||
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
406 (demuxer->file_format==DEMUXER_TYPE_MPEG_PS && ((! sh_video->format) || (sh_video->format==0x10000001) || (sh_video->format==0x10000002)))
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
407 || demuxer->file_format==DEMUXER_TYPE_PVA ||
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
408 ((demuxer->file_format==DEMUXER_TYPE_MPEG_TS) && ((sh_video->format==0x10000001) || (sh_video->format==0x10000002)))
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
409 || demuxer->file_format==DEMUXER_TYPE_MPEG_TY
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
410 #ifdef STREAMING_LIVE_DOT_COM
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
411 || (demuxer->file_format==DEMUXER_TYPE_RTP && demux_is_mpeg_rtp_stream(demuxer))
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
412 #endif
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
413 ){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
414 int in_frame=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
415 //float newfps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
416 //videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
417 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
418 int i=sync_video_packet(d_video);
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
419 //void* buffer=&videobuffer[videobuf_len+4];
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
420 int start=videobuf_len+4;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
421 if(in_frame){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
422 if(i<0x101 || i>=0x1B0){ // not slice code -> end of frame
7465
c541bb409a27 we don't need the 0x1ff hack any more!
arpi
parents: 7364
diff changeset
423 #if 0
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
424 // send END OF FRAME code:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
425 videobuffer[videobuf_len+0]=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
426 videobuffer[videobuf_len+1]=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
427 videobuffer[videobuf_len+2]=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
428 videobuffer[videobuf_len+3]=0xFF;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
429 videobuf_len+=4;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
430 #endif
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
431 if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
432 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
433 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
434 } else {
8965
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
435 if(i==0x100){
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
436 pts=d_video->pts;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
437 d_video->pts=0;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
438 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
439 //if(i==0x100) in_frame=1; // picture startcode
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
440 if(i>=0x101 && i<0x1B0) in_frame=1; // picture startcode
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
441 else if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
442 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
443 //if(grab_frames==2 && (i==0x1B3 || i==0x1B8)) grab_frames=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
444 if(!read_video_packet(d_video)) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
445 //printf("read packet 0x%X, len=%d\n",i,videobuf_len);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
446 // process headers:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
447 switch(i){
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
448 case 0x1B3: mp_header_process_sequence_header (&picture, &videobuffer[start]);break;
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
449 case 0x1B5: mp_header_process_extension (&picture, &videobuffer[start]);break;
6784
b38e38b6f88f DVD Closed Captioning support, patch by Matteo Giani <matgiani@ctonet.it>, small changes by me.
atmos4
parents: 6571
diff changeset
450 case 0x1B2: process_userdata (&videobuffer[start], videobuf_len-start);break;
8965
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
451 case 0x100: picture_coding_type=(videobuffer[start+1] >> 3) & 7;break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
452 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
453 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
454
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
455 // if(videobuf_len>max_framesize) max_framesize=videobuf_len; // debug
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
456 //printf("--- SEND %d bytes\n",videobuf_len);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
457 // if(grab_frames==1){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
458 // FILE *f=fopen("grab.mpg","ab");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
459 // fwrite(videobuffer,videobuf_len-4,1,f);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
460 // fclose(f);
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 *start=videobuffer; in_size=videobuf_len;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
464 //blit_frame=decode_video(video_out,sh_video,videobuffer,videobuf_len,drop_frame);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
465
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
466 #if 1
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
467 // get mpeg fps:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
468 //newfps=frameratecode2framerate[picture->frame_rate_code]*0.0001f;
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
469 if((int)(sh_video->fps*10000+0.5)!=picture.fps) if(!force_fps && !telecine){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
470 mp_msg(MSGT_CPLAYER,MSGL_WARN,"Warning! FPS changed %5.3f -> %5.3f (%f) [%d] \n",sh_video->fps,picture.fps*0.0001,sh_video->fps-picture.fps*0.0001,picture.frame_rate_code);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
471 sh_video->fps=picture.fps*0.0001;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
472 sh_video->frametime=10000.0f/(float)picture.fps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
473 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
474 #endif
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
475
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
476 // fix mpeg2 frametime:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
477 frame_time=(picture.display_time)*0.01f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
478 picture.display_time=100;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
479 videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
480
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
481 telecine_cnt*=0.9; // drift out error
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
482 telecine_cnt+=frame_time-5.0/4.0;
9221
arpi
parents: 9129
diff changeset
483 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"\r telecine = %3.1f %5.3f \n",frame_time,telecine_cnt);
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
484
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
485 if(telecine){
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
486 frame_time=1;
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
487 if(telecine_cnt<-1.5 || telecine_cnt>1.5){
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
488 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_LeaveTelecineMode);
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
489 telecine=0;
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
490 }
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
491 } else
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
492 if(telecine_cnt>-0.5 && telecine_cnt<0.5 && !force_fps){
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
493 sh_video->fps=sh_video->fps*4/5;
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
494 sh_video->frametime=sh_video->frametime*5/4;
11385
cd0088334aea The message parameter was removed.
diego
parents: 10709
diff changeset
495 mp_msg(MSGT_DECVIDEO,MSGL_INFO,MSGTR_EnterTelecineMode);
8967
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
496 telecine=1;
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
497 }
95f0a0d006c5 telecine detection
arpi
parents: 8965
diff changeset
498
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
499 } else if((demuxer->file_format==DEMUXER_TYPE_MPEG4_ES) || ((demuxer->file_format==DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000004)) ||
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
500 ((demuxer->file_format==DEMUXER_TYPE_MPEG_PS) && (sh_video->format==0x10000004))
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
501 ){
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
502 //
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
503 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
504 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
505 if(!i) return -1;
9069
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
506 if(!read_video_packet(d_video)) return -1; // EOF
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
507 if(i==0x1B6) break;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
508 }
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
509 *start=videobuffer; in_size=videobuf_len;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
510 videobuf_len=0;
0d2b25a821c9 raw mpeg4-es support (you need to set -fps manually!)
arpi
parents: 8967
diff changeset
511
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
512 } else if(demuxer->file_format==DEMUXER_TYPE_H264_ES || ((demuxer->file_format==DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000005)) ||
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
513 ((demuxer->file_format==DEMUXER_TYPE_MPEG_PS) && (sh_video->format==0x10000005))
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14798
diff changeset
514 ){
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
515 //
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
516 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
517 int i=sync_video_packet(d_video);
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
518 int pos = videobuf_len+4;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
519 if(!i) return -1;
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
520 if(!read_video_packet(d_video)) return -1; // EOF
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
521 if((i&~0x60) == 0x107 && i != 0x107) {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
522 h264_parse_sps(&picture, &(videobuffer[pos]), videobuf_len - pos);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
523 if(picture.fps > 0) {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
524 sh_video->fps=picture.fps*0.0001f;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
525 sh_video->frametime=10000.0f/(float)picture.fps;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
526 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
527 i=sync_video_packet(d_video);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
528 if(!i) return -1;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
529 if(!read_video_packet(d_video)) return -1; // EOF
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
530 }
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
531 if((i&~0x60) == 0x101 || (i&~0x60) == 0x102 || (i&~0x60) == 0x105) break;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
532 }
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
533 *start=videobuffer; in_size=videobuf_len;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
534 videobuf_len=0;
39b68c2664ec H264-ES demuxer
michael
parents: 9693
diff changeset
535
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
536 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
537 // frame-based file formats: (AVI,ASF,MOV)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
538 in_size=ds_get_packet(d_video,start);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
539 if(in_size<0) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
540 // if(in_size>max_framesize) max_framesize=in_size;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
541 // blit_frame=decode_video(video_out,sh_video,start,in_size,drop_frame);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
542 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
543
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
544 // vdecode_time=video_time_usage-vdecode_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
545
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
546 //------------------------ frame decoded. --------------------
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
547
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
548 // Increase video timers:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
549 sh_video->num_frames+=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
550 ++sh_video->num_frames_decoded;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
551
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
552 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
553
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
554 // 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
555 if(!force_fps) switch(demuxer->file_format){
9693
1d598bf65571 10l, found by Jan Kritzner <kritzner@informatik.rwth-aachen.de>
alex
parents: 9610
diff changeset
556 case DEMUXER_TYPE_GIF:
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
557 case DEMUXER_TYPE_REAL:
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
558 case DEMUXER_TYPE_MATROSKA:
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
559 if(d_video->pts>0 && pts1>0 && d_video->pts>pts1)
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
560 frame_time=d_video->pts-pts1;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
561 break;
6571
fdf45e8420d0 Paul Ortyl's patch
alex
parents: 6423
diff changeset
562 #ifdef USE_TV
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
563 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
564 #endif
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
565 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
566 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
567 case DEMUXER_TYPE_VIVO:
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_ASF: {
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
569 float next_pts = ds_get_next_pts(d_video);
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
570 float d= next_pts > 0 ? 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
571 if(d>=0){
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
572 if(d>0){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
573 if((int)sh_video->fps==1000)
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
574 mp_msg(MSGT_CPLAYER,MSGL_V,"\navg. framerate: %d fps \n",(int)(1.0f/d));
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
575 sh_video->frametime=d; // 1ms
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
576 sh_video->fps=1.0f/d;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
577 }
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
578 frame_time = d;
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
579 } else {
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
580 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
581 // frame_time = 1/25.0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
582 }
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
583 }
9693
1d598bf65571 10l, found by Jan Kritzner <kritzner@informatik.rwth-aachen.de>
alex
parents: 9610
diff changeset
584 break;
12170
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
585 case DEMUXER_TYPE_LAVF:
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
586 if((int)sh_video->fps==1000 || (int)sh_video->fps<=1){
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
587 float next_pts = ds_get_next_pts(d_video);
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
588 float d= next_pts > 0 ? next_pts - d_video->pts : d_video->pts-pts1;
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
589 if(d>=0){
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
590 frame_time = d;
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
591 }
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
592 }
8db1b587d16a lavf ASF support
michael
parents: 11833
diff changeset
593 break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
594 }
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
595
4705
f6d45a3f005c mpeg-es osd fix - patch by ??? (lost mail:((()
arpi
parents: 4336
diff changeset
596 if(demuxer->file_format==DEMUXER_TYPE_MPEG_PS ||
14034
7ac60a1c576e merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS
nicodvb
parents: 12170
diff changeset
597 ((demuxer->file_format==DEMUXER_TYPE_MPEG_TS) && ((sh_video->format==0x10000001) || (sh_video->format==0x10000002))) ||
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
598 demuxer->file_format==DEMUXER_TYPE_MPEG_ES ||
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9824
diff changeset
599 demuxer->file_format==DEMUXER_TYPE_MPEG_TY){
8965
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
600
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
601 // if(pts>0.0001) printf("\r!!! pts: %5.3f [%d] (%5.3f) \n",pts,picture_coding_type,i_pts);
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
602
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
603 sh_video->pts+=frame_time;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
604 if(picture_coding_type<=2 && sh_video->i_pts){
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
605 // printf("XXX predict: %5.3f pts: %5.3f error=%5.5f \n",i_pts,d_video->pts2,i_pts-d_video->pts2);
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
606 sh_video->pts=sh_video->i_pts;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
607 sh_video->i_pts=pts;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
608 } else {
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
609 if(pts){
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
610 if(picture_coding_type<=2) sh_video->i_pts=pts;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
611 else {
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
612 // printf("BBB predict: %5.3f pts: %5.3f error=%5.5f \n",pts,d_video->pts2,pts-d_video->pts2);
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
613 sh_video->pts=pts;
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
614 }
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
615 }
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
616 }
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
617 // printf("\rIII pts: %5.3f [%d] (%5.3f) \n",d_video->pts2,picture_coding_type,i_pts);
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
618 } else
14fa6a121a47 fixed the well-known DVD/DVB audio delay bug :)
arpi
parents: 8027
diff changeset
619 sh_video->pts=d_video->pts;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
620
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
621 if(frame_time_ptr) *frame_time_ptr=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
622 return in_size;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
623
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
624 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
625