annotate libmpdemux/video.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 71fa805e84d6
children f6d45a3f005c
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
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
22 static mp_mpeg_header_t picture;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
23
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
24 int video_read_properties(sh_video_t *sh_video){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
25 demux_stream_t *d_video=sh_video->ds;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
26
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
27 // Determine image properties:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
28 switch(d_video->demuxer->file_format){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
29 case DEMUXER_TYPE_AVI:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
30 case DEMUXER_TYPE_ASF: {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
31 // display info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
32 sh_video->format=sh_video->bih->biCompression;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
33 sh_video->disp_w=sh_video->bih->biWidth;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
34 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
35
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
36 #if 1
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
37 /* 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
38 if ((sh_video->format == 0x10000001) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
39 (sh_video->format == 0x10000002) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
40 (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
41 (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
42 (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
43 (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
44 (sh_video->format == mmioFOURCC('m','p','e','g')) ||
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
45 (sh_video->format == mmioFOURCC('m','p','e','g')))
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
46 {
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
47 int saved_pos, saved_type;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
48
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
49 /* 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
50 reading the mpeg header self! */
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
51
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
52 saved_pos = d_video->buffer_pos;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
53 saved_type = d_video->demuxer->file_format;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
54
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
55 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
56 video_read_properties(sh_video);
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
57 d_video->demuxer->file_format = saved_type;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
58 d_video->buffer_pos = saved_pos;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
59 // goto mpeg_header_parser;
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
60 }
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
61 #endif
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
62 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
63 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
64 case DEMUXER_TYPE_MPEG_ES:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
65 case DEMUXER_TYPE_MPEG_PS: {
3980
cdd55ab40363 libmpeg2 is now able to decode framecopied (with mencoder) mpeg files
alex
parents: 3726
diff changeset
66 //mpeg_header_parser:
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
67 // Find sequence_header first:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
68 videobuf_len=0; videobuf_code_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
69 mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence header... ");fflush(stdout);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
70 while(1){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
71 int i=sync_video_packet(d_video);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
72 if(i==0x1B3) break; // found it!
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
73 if(!i || !skip_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
74 if(verbose) mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
75 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MpegNoSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
76 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
77 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
78 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
79 mp_msg(MSGT_DECVIDEO,MSGL_V,"OK!\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
80 // sh_video=d_video->sh;sh_video->ds=d_video;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
81 // mpeg2_init();
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
82 // ========= Read & process sequence header & extension ============
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
83 if(!videobuffer) videobuffer=(char*)memalign(8,VIDEOBUFFER_SIZE);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
84 if(!videobuffer){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
85 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
86 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
87 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
88
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
89 if(!read_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
90 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
91 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
92 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
93 if(mp_header_process_sequence_header (&picture, &videobuffer[4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
94 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdr);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
95 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
96 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
97 if(sync_video_packet(d_video)==0x1B5){ // next packet is seq. ext.
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
98 // videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
99 int pos=videobuf_len;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
100 if(!read_video_packet(d_video)){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
101 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_CannotReadMpegSequHdrEx);
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 if(mp_header_process_extension (&picture, &videobuffer[pos+4])) {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
105 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_BadMpegSequHdrEx);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
106 return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
107 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
108 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
109
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
110 // printf("picture.fps=%d\n",picture.fps);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
111
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
112 // fill aspect info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
113 switch(picture.aspect_ratio_information){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
114 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
115 case 4: // SECAM 4:3? - XXX check with more files!
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
116 case 8: // PAL VCD 4:3
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
117 case 12: // NTSC VCD 4:3
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
118 sh_video->aspect=4.0/3.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
119 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
120 case 3: // PAL/NTSC Widescreen SVCD/DVD 16:9
3666
70c409621d92 Add aspect 6, anamorphic 16:9 for svcd
atmos4
parents: 3526
diff changeset
121 case 6: // (PAL?)/NTSC Widescreen SVCD 16:9
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
122 sh_video->aspect=16.0/9.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
123 break;
4336
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
124 case 9: // Movie Type ??? / 640x480
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
125 sh_video->aspect=0.0;
71fa805e84d6 aspect ratio 9 added.
jaf
parents: 4074
diff changeset
126 break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
127 default:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
128 fprintf(stderr,"Detected unknown aspect_ratio_information in mpeg sequence header.\n"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
129 "Please report the aspect value (%i) along with the movie type (VGA,PAL,NTSC,"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
130 "SECAM) and the movie resolution (720x576,352x240,480x480,...) to the MPlayer"
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
131 " 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
132 picture.aspect_ratio_information);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
133 case 1: // VGA 1:1 - do not prescale
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
134 sh_video->aspect=0.0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
135 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
136 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
137 // display info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
138 sh_video->format=picture.mpeg1?0x10000001:0x10000002; // mpeg video
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
139 sh_video->fps=picture.fps*0.0001f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
140 if(!sh_video->fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
141 // if(!force_fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
142 // fprintf(stderr,"FPS not specified (or invalid) in the header! Use the -fps option!\n");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
143 // return 0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
144 // }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
145 sh_video->frametime=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
146 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
147 sh_video->frametime=10000.0f/(float)picture.fps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
148 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
149 sh_video->disp_w=picture.display_picture_width;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
150 sh_video->disp_h=picture.display_picture_height;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
151 // bitrate:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
152 if(picture.bitrate!=0x3FFFF) // unspecified/VBR ?
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
153 sh_video->i_bps=1000*picture.bitrate/16;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
154 // info:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
155 mp_dbg(MSGT_DECVIDEO,MSGL_DBG2,"mpeg bitrate: %d (%X)\n",picture.bitrate,picture.bitrate);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
156 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
157 picture.mpeg1?"MPEG1":"MPEG2",
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
158 sh_video->disp_w,sh_video->disp_h,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
159 picture.aspect_ratio_information,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
160 sh_video->fps,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
161 picture.bitrate*0.5f,
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
162 picture.bitrate/16.0f );
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
163 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
164 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
165 } // switch(file_format)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
166
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
167 return 1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
168 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
169
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
170 static void process_userdata(unsigned char* buf,int len){
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
171 int i;
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
172 printf( "user_data: len=%3d %02X %02X %02X %02X '",
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
173 len, buf[0], buf[1], buf[2], buf[3]);
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
174 for(i=0;i<len;i++)
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
175 if(buf[i]>=32 && buf[i]<127) putchar(buf[i]);
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
176 printf("'\n");
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
177 }
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
178
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
179 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
180 demux_stream_t *d_video=sh_video->ds;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
181 demuxer_t *demuxer=d_video->demuxer;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
182 float frame_time=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
183 float pts1=d_video->pts;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
184 // unsigned char* start=NULL;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
185 int in_size=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
186
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
187 *start=NULL;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
188
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
189 if(demuxer->file_format==DEMUXER_TYPE_MPEG_ES || demuxer->file_format==DEMUXER_TYPE_MPEG_PS){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
190 int in_frame=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
191 //float newfps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
192 //videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
193 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
194 int i=sync_video_packet(d_video);
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
195 //void* buffer=&videobuffer[videobuf_len+4];
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
196 int start=videobuf_len+4;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
197 if(in_frame){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
198 if(i<0x101 || i>=0x1B0){ // not slice code -> end of frame
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
199 #if 1
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
200 // send END OF FRAME code:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
201 videobuffer[videobuf_len+0]=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
202 videobuffer[videobuf_len+1]=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
203 videobuffer[videobuf_len+2]=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
204 videobuffer[videobuf_len+3]=0xFF;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
205 videobuf_len+=4;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
206 #endif
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
207 if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
208 break;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
209 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
210 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
211 //if(i==0x100) in_frame=1; // picture startcode
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
212 if(i>=0x101 && i<0x1B0) in_frame=1; // picture startcode
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
213 else if(!i) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
214 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
215 //if(grab_frames==2 && (i==0x1B3 || i==0x1B8)) grab_frames=1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
216 if(!read_video_packet(d_video)) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
217 //printf("read packet 0x%X, len=%d\n",i,videobuf_len);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
218 // process headers:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
219 switch(i){
4074
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
220 case 0x1B3: mp_header_process_sequence_header (&picture, &videobuffer[start]);break;
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
221 case 0x1B5: mp_header_process_extension (&picture, &videobuffer[start]);break;
aca490499e1f added mpeg userdata dump
arpi
parents: 3980
diff changeset
222 case 0x1B2: if(verbose) process_userdata (&videobuffer[start], videobuf_len-start);break;
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
223 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
224 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
225
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
226 // if(videobuf_len>max_framesize) max_framesize=videobuf_len; // debug
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
227 //printf("--- SEND %d bytes\n",videobuf_len);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
228 // if(grab_frames==1){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
229 // FILE *f=fopen("grab.mpg","ab");
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
230 // fwrite(videobuffer,videobuf_len-4,1,f);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
231 // fclose(f);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
232 // }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
233
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
234 *start=videobuffer; in_size=videobuf_len;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
235 //blit_frame=decode_video(video_out,sh_video,videobuffer,videobuf_len,drop_frame);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
236
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
237 #if 1
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
238 // get mpeg fps:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
239 //newfps=frameratecode2framerate[picture->frame_rate_code]*0.0001f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
240 if((int)(sh_video->fps*10000+0.5)!=picture.fps) if(!force_fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
241 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
242 sh_video->fps=picture.fps*0.0001;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
243 sh_video->frametime=10000.0f/(float)picture.fps;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
244 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
245 #endif
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
246
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
247 // fix mpeg2 frametime:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
248 frame_time=(picture.display_time)*0.01f;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
249 picture.display_time=100;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
250 videobuf_len=0;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
251
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
252 } else {
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
253 // frame-based file formats: (AVI,ASF,MOV)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
254 in_size=ds_get_packet(d_video,start);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
255 if(in_size<0) return -1; // EOF
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
256 // if(in_size>max_framesize) max_framesize=in_size;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
257 // blit_frame=decode_video(video_out,sh_video,start,in_size,drop_frame);
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
258 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
259
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
260 // vdecode_time=video_time_usage-vdecode_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
261
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
262 //------------------------ frame decoded. --------------------
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
263
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
264 // Increase video timers:
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
265 sh_video->num_frames+=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
266 ++sh_video->num_frames_decoded;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
267
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
268 frame_time*=sh_video->frametime;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
269 if(demuxer->file_format==DEMUXER_TYPE_ASF && !force_fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
270 // .ASF files has no fixed FPS - just frame durations!
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
271 float d=d_video->pts-pts1;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
272 if(d>=0 && d<5) frame_time=d;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
273 if(d>0){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
274 if(verbose)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
275 if((int)sh_video->fps==1000)
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
276 mp_msg(MSGT_CPLAYER,MSGL_STATUS,"\rASF framerate: %d fps \n",(int)(1.0f/d));
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
277 sh_video->frametime=d; // 1ms
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
278 sh_video->fps=1.0f/d;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
279 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
280 } else
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
281 if(demuxer->file_format==DEMUXER_TYPE_MOV && !force_fps){
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
282 // .MOV files has no fixed FPS - just frame durations!
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
283 frame_time=d_video->pts-pts1;
3526
cf787373f0aa vivo A-V sync fixed
arpi
parents: 3379
diff changeset
284 } else
cf787373f0aa vivo A-V sync fixed
arpi
parents: 3379
diff changeset
285 if(demuxer->file_format==DEMUXER_TYPE_VIVO && !force_fps){
cf787373f0aa vivo A-V sync fixed
arpi
parents: 3379
diff changeset
286 // .VIVO files has no fixed FPS - just frame durations!
cf787373f0aa vivo A-V sync fixed
arpi
parents: 3379
diff changeset
287 if(d_video->pts-pts1>0)
cf787373f0aa vivo A-V sync fixed
arpi
parents: 3379
diff changeset
288 frame_time=d_video->pts-pts1;
cf787373f0aa vivo A-V sync fixed
arpi
parents: 3379
diff changeset
289 mp_msg(MSGT_CPLAYER,MSGL_V,"vivo frame_time=%5.3f \n",frame_time);
2567
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
290 }
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
291
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
292 if(demuxer->file_format==DEMUXER_TYPE_MPEG_PS) d_video->pts+=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
293
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
294 if(frame_time_ptr) *frame_time_ptr=frame_time;
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
295 return in_size;
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
ea6158be8103 video frame reading cleanup
arpi
parents:
diff changeset
299