annotate libmpdemux/video.c @ 8763:19e96e60a3d0

Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
author anders
date Sat, 04 Jan 2003 06:19:25 +0000
parents b9da278e4c92
children 14fa6a121a47
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
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
28 static mp_mpeg_header_t picture;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
29
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
30 int video_read_properties(sh_video_t *sh_video){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
31 demux_stream_t *d_video=sh_video->ds;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
32
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
33 // Determine image properties:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
34 switch(d_video->demuxer->file_format){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
35 case DEMUXER_TYPE_AVI:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
36 case DEMUXER_TYPE_ASF: {
4774
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
37 // display info:
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
38
5898
31202ff6fb3d ugly workaround disabled
arpi
parents: 5573
diff changeset
39 #if 0
4774
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
40 if(sh_video->bih->biCompression == BI_RGB &&
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
41 (sh_video->video.fccHandler == mmioFOURCC('D', 'I', 'B', ' ') ||
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
42 sh_video->video.fccHandler == mmioFOURCC('R', 'G', 'B', ' ') ||
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
43 sh_video->video.fccHandler == mmioFOURCC('R', 'A', 'W', ' ') ||
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
44 sh_video->video.fccHandler == 0)) {
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
45 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
46 }
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
47 else
5898
31202ff6fb3d ugly workaround disabled
arpi
parents: 5573
diff changeset
48 #endif
4774
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
49 sh_video->format=sh_video->bih->biCompression;
fc2f76964606 Patch: Improved raw encoding support in mencoder by Fredrik Kuivinen
atmos4
parents: 4705
diff changeset
50
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
51 sh_video->disp_w=sh_video->bih->biWidth;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
52 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
53
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
54 #if 1
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
55 /* 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
56 if ((sh_video->format == 0x10000001) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
57 (sh_video->format == 0x10000002) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
58 (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
59 (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
60 (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
61 (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
62 (sh_video->format == mmioFOURCC('m','p','e','g')) ||
7302
7d32189dbae4 typo (checking for mpeg twice, instead of mpeg & MPEG)
michael
parents: 7208
diff changeset
63 (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
64 {
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
65 int saved_pos, saved_type;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
66
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
67 /* 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
68 reading the mpeg header self! */
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
69
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
70 saved_pos = d_video->buffer_pos;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
71 saved_type = d_video->demuxer->file_format;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
72
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
73 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
74 video_read_properties(sh_video);
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
75 d_video->demuxer->file_format = saved_type;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
76 d_video->buffer_pos = saved_pos;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
77 // goto mpeg_header_parser;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
78 }
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
79 #endif
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
80 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
81 }
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
82 #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
83 case DEMUXER_TYPE_RTP:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
84 // If the RTP stream is a MPEG stream, then we use this code to check
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
85 // for MPEG headers:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
86 if (!demux_is_mpeg_rtp_stream(d_video->demuxer)) break;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
87 // otherwise fall through to...
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
88 #endif
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents: 7302
diff changeset
89 case DEMUXER_TYPE_PVA:
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
90 case DEMUXER_TYPE_MPEG_ES:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
91 case DEMUXER_TYPE_MPEG_PS: {
3980
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
92 //mpeg_header_parser:
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
93 // Find sequence_header first:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
94 videobuf_len=0; videobuf_code_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
95 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence header... ");fflush(stdout);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
96 while(1){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
97 int i=sync_video_packet(d_video);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
98 if(i==0x1B3) break; // found it!
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
99 if(!i || !skip_video_packet(d_video)){
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7465
diff changeset
100 if(verbose>0) mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
101 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MpegNoSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
102 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
103 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
104 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
105 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
106 // sh_video=d_video->sh;sh_video->ds=d_video;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
107 // mpeg2_init();
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
108 // ========= Read & process sequence header & extension ============
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
109 if(!videobuffer) videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
110 if(!videobuffer){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
111 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
112 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
113 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
114
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
115 if(!read_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
116 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
117 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
118 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
119 if(mp_header_process_sequence_header (&picture, &videobuffer[4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
120 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
121 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
122 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
123 if(sync_video_packet(d_video)==0x1B5){ // next packet is seq. ext.
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
124 // videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
125 int pos=videobuf_len;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
126 if(!read_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
127 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
128 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
129 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
130 if(mp_header_process_extension (&picture, &videobuffer[pos+4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
131 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
132 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
133 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
134 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
135
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
136 // printf("picture.fps=%d\n",picture.fps);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
137
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
138 // fill aspect info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
139 switch(picture.aspect_ratio_information){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
140 case 2: // PAL/NTSC SVCD/DVD 4:3
3379
84ed0593187c Add aspect 4 to known aspect codes, probably SECAM 4:3, at least sample file was 4:3.
atmos4
parents: 2775
diff changeset
141 case 4: // SECAM 4:3? - XXX check with more files!
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
142 case 8: // PAL VCD 4:3
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
143 case 12: // NTSC VCD 4:3
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
144 sh_video->aspect=4.0/3.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
145 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
146 case 3: // PAL/NTSC Widescreen SVCD/DVD 16:9
3666
70c409621d92 Add aspect 6, anamorphic 16:9 for svcd
atmos4
parents: 3526
diff changeset
147 case 6: // (PAL?)/NTSC Widescreen SVCD 16:9
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
148 sh_video->aspect=16.0/9.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
149 break;
4336
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
150 case 9: // Movie Type ??? / 640x480
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
151 sh_video->aspect=0.0;
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
152 break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
153 default:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
154 fprintf(stderr,"Detected unknown aspect_ratio_information in mpeg sequence header.\n"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
155 "Please report the aspect value (%i) along with the movie type (VGA,PAL,NTSC,"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
156 "SECAM) and the movie resolution (720x576,352x240,480x480,...) to the MPlayer"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
157 " 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
158 picture.aspect_ratio_information);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
159 case 1: // VGA 1:1 - do not prescale
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
160 sh_video->aspect=0.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
161 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
162 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
163 // display info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
164 sh_video->format=picture.mpeg1?0x10000001:0x10000002; // mpeg video
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
165 sh_video->fps=picture.fps*0.0001f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
166 if(!sh_video->fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
167 // if(!force_fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
168 // fprintf(stderr,"FPS not specified (or invalid) in the header! Use the -fps option!\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
169 // return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
170 // }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
171 sh_video->frametime=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
172 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
173 sh_video->frametime=10000.0f/(float)picture.fps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
174 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
175 sh_video->disp_w=picture.display_picture_width;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
176 sh_video->disp_h=picture.display_picture_height;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
177 // bitrate:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
178 if(picture.bitrate!=0x3FFFF) // unspecified/VBR ?
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
179 sh_video->i_bps=1000*picture.bitrate/16;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
180 // info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
181 mp_dbg(MSGT_DECVIDEO,MSGL_DBG2,"mpeg bitrate: %d (%X)\n",picture.bitrate,picture.bitrate);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
182 mp_msg(MSGT_DECVIDEO,MSGL_INFO,"VIDEO: %s %dx%d (aspect %d) %4.2f fps %5.1f kbps (%4.1f kbyte/s)\n",
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
183 picture.mpeg1?"MPEG1":"MPEG2",
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
184 sh_video->disp_w,sh_video->disp_h,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
185 picture.aspect_ratio_information,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
186 sh_video->fps,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
187 picture.bitrate*0.5f,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
188 picture.bitrate/16.0f );
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
189 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
190 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
191 } // switch(file_format)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
192
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
193 return 1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
194 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
195
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
196 static void process_userdata(unsigned char* buf,int len){
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
197 int i;
6791
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
198 /* if the user data starts with "CC", assume it is a CC info packet */
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
199 if(len>2 && buf[0]=='C' && buf[1]=='C'){
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
200 // 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
201 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
202 }
7208
79fb883d9769 user-data moved one -v up
arpi
parents: 6910
diff changeset
203 if(verbose<2) return;
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
204 printf( "user_data: len=%3d %02X %02X %02X %02X '",
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
205 len, buf[0], buf[1], buf[2], buf[3]);
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
206 for(i=0;i<len;i++)
6791
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
207 // if(buf[i]>=32 && buf[i]<127) putchar(buf[i]);
a3b2f80f3a26 codmetics :)
arpi
parents: 6784
diff changeset
208 if(buf[i]&0x60) putchar(buf[i]&0x7F);
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
209 printf("'\n");
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
210 }
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
211
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
212 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
213 demux_stream_t *d_video=sh_video->ds;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
214 demuxer_t *demuxer=d_video->demuxer;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
215 float frame_time=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
216 float pts1=d_video->pts;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
217 // unsigned char* start=NULL;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
218 int in_size=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
219
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
220 *start=NULL;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
221
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
222 if(demuxer->file_format==DEMUXER_TYPE_MPEG_ES || demuxer->file_format==DEMUXER_TYPE_MPEG_PS
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents: 7302
diff changeset
223 || demuxer->file_format==DEMUXER_TYPE_PVA
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
224 #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
225 || (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
226 #endif
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents: 6791
diff changeset
227 ){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
228 int in_frame=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
229 //float newfps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
230 //videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
231 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
232 int i=sync_video_packet(d_video);
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
233 //void* buffer=&videobuffer[videobuf_len+4];
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
234 int start=videobuf_len+4;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
235 if(in_frame){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
236 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
237 #if 0
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
238 // send END OF FRAME code:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
239 videobuffer[videobuf_len+0]=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
240 videobuffer[videobuf_len+1]=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
241 videobuffer[videobuf_len+2]=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
242 videobuffer[videobuf_len+3]=0xFF;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
243 videobuf_len+=4;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
244 #endif
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
245 if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
246 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
247 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
248 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
249 //if(i==0x100) in_frame=1; // picture startcode
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
250 if(i>=0x101 && i<0x1B0) in_frame=1; // picture startcode
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
251 else if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
252 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
253 //if(grab_frames==2 && (i==0x1B3 || i==0x1B8)) grab_frames=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
254 if(!read_video_packet(d_video)) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
255 //printf("read packet 0x%X, len=%d\n",i,videobuf_len);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
256 // process headers:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
257 switch(i){
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
258 case 0x1B3: mp_header_process_sequence_header (&picture, &videobuffer[start]);break;
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
259 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
260 case 0x1B2: process_userdata (&videobuffer[start], videobuf_len-start);break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
261 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
262 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
263
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
264 // if(videobuf_len>max_framesize) max_framesize=videobuf_len; // debug
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
265 //printf("--- SEND %d bytes\n",videobuf_len);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
266 // if(grab_frames==1){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
267 // FILE *f=fopen("grab.mpg","ab");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
268 // fwrite(videobuffer,videobuf_len-4,1,f);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
269 // fclose(f);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
270 // }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
271
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
272 *start=videobuffer; in_size=videobuf_len;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
273 //blit_frame=decode_video(video_out,sh_video,videobuffer,videobuf_len,drop_frame);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
274
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
275 #if 1
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
276 // get mpeg fps:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
277 //newfps=frameratecode2framerate[picture->frame_rate_code]*0.0001f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
278 if((int)(sh_video->fps*10000+0.5)!=picture.fps) if(!force_fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
279 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
280 sh_video->fps=picture.fps*0.0001;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
281 sh_video->frametime=10000.0f/(float)picture.fps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
282 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
283 #endif
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
284
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
285 // fix mpeg2 frametime:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
286 frame_time=(picture.display_time)*0.01f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
287 picture.display_time=100;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
288 videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
289
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
290 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
291 // frame-based file formats: (AVI,ASF,MOV)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
292 in_size=ds_get_packet(d_video,start);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
293 if(in_size<0) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
294 // if(in_size>max_framesize) max_framesize=in_size;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
295 // blit_frame=decode_video(video_out,sh_video,start,in_size,drop_frame);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
296 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
297
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
298 // vdecode_time=video_time_usage-vdecode_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
299
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
300 //------------------------ frame decoded. --------------------
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
301
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
302 // Increase video timers:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
303 sh_video->num_frames+=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
304 ++sh_video->num_frames_decoded;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
305
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
306 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
307
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
308 // 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
309 if(!force_fps) switch(demuxer->file_format){
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
310 case DEMUXER_TYPE_REAL:
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
311 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
312 frame_time=d_video->pts-pts1;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
313 break;
6571
fdf45e8420d0 Paul Ortyl's patch
alex
parents: 6423
diff changeset
314 #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
315 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
316 #endif
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
317 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
318 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
319 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
320 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
321 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
322 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
323 if(d>=0){
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
324 if(d>0){
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
325 if((int)sh_video->fps==1000)
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
326 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
327 sh_video->frametime=d; // 1ms
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
328 sh_video->fps=1.0f/d;
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
329 }
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
330 frame_time = d;
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5898
diff changeset
331 } else {
6423
13cf65db9ebc fixed playback speed and a-v sync issues
arpi
parents: 6371
diff changeset
332 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
333 // frame_time = 1/25.0;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
334 }
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
335 }
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
336 }
5573
b8a8ab95c73d generalized the cut'n'pasted variable fps code, #ifdef-ed TV until v4l is updated
arpi
parents: 5572
diff changeset
337
4705
f6d45a3f005c mpeg-es osd fix - patch by ??? (lost mail:((()
arpi
parents: 4336
diff changeset
338 if(demuxer->file_format==DEMUXER_TYPE_MPEG_PS ||
f6d45a3f005c mpeg-es osd fix - patch by ??? (lost mail:((()
arpi
parents: 4336
diff changeset
339 demuxer->file_format==DEMUXER_TYPE_MPEG_ES) d_video->pts+=frame_time;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
340
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
341 if(frame_time_ptr) *frame_time_ptr=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
342 return in_size;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
343
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
344 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
345