comparison libmpdemux/demux_nsv.c @ 12179:aeb377ccb110

Fix vp61 keyframe search (do not skip blocks if 1st frame is keyframe)
author rtognimp
date Mon, 12 Apr 2004 17:13:15 +0000
parents da8e39bfe121
children 12ddc64011fe
comparison
equal deleted inserted replaced
12178:4a3a984b2fb4 12179:aeb377ccb110
132 demuxer_t* demux_open_nsv ( demuxer_t* demuxer ) 132 demuxer_t* demux_open_nsv ( demuxer_t* demuxer )
133 { 133 {
134 // last 2 bytes 17 and 18 are unknown but right after that comes the length 134 // last 2 bytes 17 and 18 are unknown but right after that comes the length
135 unsigned char hdr[17]; 135 unsigned char hdr[17];
136 int videolen,audiolen; 136 int videolen,audiolen;
137 unsigned char buf[9];
137 sh_video_t *sh_video = NULL; 138 sh_video_t *sh_video = NULL;
138 sh_audio_t *sh_audio = NULL; 139 sh_audio_t *sh_audio = NULL;
139 140
140 141
141 // vp6x magic keyframe ee if no keyframe f0 if keyframe correct if theres a mistake 142 // vp6x magic keyframe ee if no keyframe f0 if keyframe correct if theres a mistake
263 mp_msg(MSGT_DEMUX,MSGL_WARN,"demux_nsv: VP50 video does not work yet. Expect problems.\n"); 264 mp_msg(MSGT_DEMUX,MSGL_WARN,"demux_nsv: VP50 video does not work yet. Expect problems.\n");
264 265
265 // here we search for the correct keyframe 266 // here we search for the correct keyframe
266 // vp6 keyframe is when the 2nd byte of the vp6 header is 0x36 267 // vp6 keyframe is when the 2nd byte of the vp6 header is 0x36
267 if(priv->v_format==mmioFOURCC('V','P','6','1')){ 268 if(priv->v_format==mmioFOURCC('V','P','6','1')){
268 stream_read(demuxer->stream,hdr,9); 269 stream_read(demuxer->stream,buf,9);
269 videolen=(hdr[2]>>4)|(hdr[3]<<4)|(hdr[4]<<0xC);
270 audiolen=(hdr[5])|(hdr[6]<<8);
271 mp_msg(MSGT_DEMUX,MSGL_V,"demux_nsv: Header: %08X\n",*hdr);
272 stream_skip(demuxer->stream, videolen+audiolen-2);
273 stream_read(demuxer->stream,hdr,9);
274
275 if (hdr[8]!=0x36) { 270 if (hdr[8]!=0x36) {
276 while(hdr[8]!=0x36){ 271 mp_msg(MSGT_DEMUX,MSGL_V,"demux_nsv: searching vp6 keyframe...\n");
277 videolen=(hdr[2]>>4)|(hdr[3]<<4)|(hdr[4]<<0xC); 272 while(buf[8]!=0x36){
278 audiolen=(hdr[5])|(hdr[6]<<8); 273 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_nsv: vp6 block skip.\n");
274 videolen=(buf[2]>>4)|(buf[3]<<4)|(buf[4]<<0xC);
275 audiolen=(buf[5])|(buf[6]<<8);
279 stream_skip(demuxer->stream, videolen+audiolen-2); 276 stream_skip(demuxer->stream, videolen+audiolen-2);
280 stream_read(demuxer->stream,hdr,9); 277 stream_read(demuxer->stream,buf,9);
281 if(hdr[0]==0x4E){ 278 if(buf[0]==0x4E){
279 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_nsv: Got NSVs block.\n");
282 if(stream_eof(demuxer->stream)) return 0; 280 if(stream_eof(demuxer->stream)) return 0;
283 stream_skip(demuxer->stream,8); 281 stream_skip(demuxer->stream,8);
284 stream_read(demuxer->stream,hdr,9); 282 stream_read(demuxer->stream,buf,9);
285 } 283 }
286 } 284 }
287 } 285 }
288 286
289 287