[Mplayerxp-cvslog] CVS: mplayerxp/mplayerxp/libmpdemux demux_fli.c,1.9,1.10 demux_mov.c,1.33,1.34 de
Brought to you by:
olov
From: Nick K. <nic...@us...> - 2006-02-21 17:14:22
|
Update of /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14754/mplayerxp/libmpdemux Modified Files: demux_fli.c demux_mov.c demux_mpg.c demux_nsv.c demux_nuv.c demux_pva.c demux_roq.c demux_smjpeg.c demux_ts.c demux_viv.c demux_y4m.c Log Message: move keyframe detection into demuxuer Index: demux_fli.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_fli.c,v retrieving revision 1.9 retrieving revision 1.10 diff -p -u -d -r1.9 -r1.10 --- demux_fli.c 14 Feb 2006 07:40:01 -0000 1.9 +++ demux_fli.c 21 Feb 2006 17:14:15 -0000 1.10 @@ -3,6 +3,7 @@ by Mike Melanson TODO: demuxer->movi_length + TODO: DP_KEYFRAME */ #include <stdio.h> Index: demux_mov.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_mov.c,v retrieving revision 1.33 retrieving revision 1.34 diff -p -u -d -r1.33 -r1.34 --- demux_mov.c 14 Feb 2006 07:40:01 -0000 1.33 +++ demux_mov.c 21 Feb 2006 17:14:15 -0000 1.34 @@ -15,6 +15,7 @@ http://www.cmlab.csie.ntu.edu.tw/~pkhsiao/thesis.html I really recommend N4270-1.doc and N4270-2.doc which are exact specs of the MP4-File Format and the MPEG4 Specific extensions. ::atmos + TODO: DP_KEYFRAME */ #include <stdio.h> #include <stdlib.h> @@ -1853,6 +1854,7 @@ if(trak->pos==0 && trak->stream_header_l // we have to append the stream header... demux_packet_t* dp=new_demux_packet(x+trak->stream_header_len); memcpy(dp->buffer,trak->stream_header,trak->stream_header_len); + dp->pos=stream_tell(demuxer->stream)-trak->stream_header_len; x=stream_read(demuxer->stream,dp->buffer+trak->stream_header_len,x); resize_demux_packet(dp,x+trak->stream_header_len); free(trak->stream_header); @@ -1860,7 +1862,6 @@ if(trak->pos==0 && trak->stream_header_l trak->stream_header_len = 0; dp->pts=pts; dp->flags=DP_NONKEYFRAME; - dp->pos=pos; // FIXME? ds_add_packet(ds,dp); } else ds_read_packet(ds,demuxer->stream,x,pts,pos,DP_NONKEYFRAME); Index: demux_mpg.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_mpg.c,v retrieving revision 1.27 retrieving revision 1.28 diff -p -u -d -r1.27 -r1.28 --- demux_mpg.c 14 Feb 2006 07:40:01 -0000 1.27 +++ demux_mpg.c 21 Feb 2006 17:14:15 -0000 1.28 @@ -30,8 +30,10 @@ #define VIDEO_MPEG2 0x10000002 #define VIDEO_MPEG4 0x10000004 #define VIDEO_H264 0x10000005 -#define AUDIO_MPEG 0x50 +#define AUDIO_MP2 0x50 +#define AUDIO_MP3 0x55 #define AUDIO_A52 0x2000 +#define AUDIO_DTS 0x2001 #define AUDIO_LPCM_BE 0x10001 #define AUDIO_AAC mmioFOURCC('M', 'P', '4', 'A') @@ -65,7 +67,7 @@ static struct mpg_stat_s { int num_mp3audio_packets; }mpg_stat; -static unsigned int read_mpeg_timestamp(stream_t *s,int c,int id){ +static unsigned int read_mpeg_timestamp(stream_t *s,int c){ int d,e; unsigned int pts; d=stream_read_word(s); @@ -114,7 +116,7 @@ static int parse_psm(demuxer_t *demux, i break; case 0x3: case 0x4: - priv->es_map[idoffset] = AUDIO_MPEG; + priv->es_map[idoffset] = AUDIO_MP2; break; case 0x0f: case 0x11: @@ -148,16 +150,35 @@ static void new_audio_stream(demuxer_t * new_sh_audio(demux,aid); sh_a = (sh_audio_t*)demux->a_streams[aid]; switch(aid & 0xE0){ // 1110 0000 b (high 3 bit: type low 5: id) - case 0x00: sh_a->format=0x50;break; // mpeg - case 0xA0: sh_a->format=0x10001;break; // dvd pcm - case 0x80: if((aid & 0xF8) == 0x88) sh_a->format=0x2001;//dts - else sh_a->format=0x2000;break; // ac3 + case 0x00: sh_a->format=AUDIO_MP2;break; + case 0xA0: sh_a->format=AUDIO_LPCM_BE;break; + case 0x80: if((aid & 0xF8) == 0x88) sh_a->format=AUDIO_DTS; + else sh_a->format=AUDIO_A52; + break; } if (mpg_d) mpg_d->a_stream_ids[mpg_d->num_a_streams++] = aid; } if(demux->audio->id==-1) demux->audio->id=aid; } +static int is_mpg_keyframe(uint32_t fourcc, int i,uint8_t* buf) +{ + int rval=DP_NONKEYFRAME; + switch(fourcc) + { + case VIDEO_H264: + if((i & ~0x60) == 0x101 || (i & ~0x60) == 0x102 || (i & ~0x60) == 0x105) rval=DP_KEYFRAME; + break; + case VIDEO_MPEG4: + if(i==0x1B6 && (buf[4]&0x3F)==0) rval=DP_KEYFRAME; + break; + default: // VIDEO_MPEG1/VIDEO_MPEG2 + if(i==0x1B3 || i==0x1B8) rval=DP_KEYFRAME; + break; + } + return rval; +} + static int demux_mpg_read_packet(demuxer_t *demux,int id){ int d; int len; @@ -209,14 +230,14 @@ static int demux_mpg_read_packet(demuxer } // Read System-1 stream timestamps: if((c>>4)==2){ - pts=read_mpeg_timestamp(demux->stream,c,id); + pts=read_mpeg_timestamp(demux->stream,c); len-=4; } else if((c>>4)==3){ - pts=read_mpeg_timestamp(demux->stream,c,id); + pts=read_mpeg_timestamp(demux->stream,c); c=stream_read_char(demux->stream); if((c>>4)!=1) pts=0; - dts=read_mpeg_timestamp(demux->stream,c,id); + dts=read_mpeg_timestamp(demux->stream,c); len-=4+1+4; } else if((c>>6)==2){ @@ -237,14 +258,14 @@ static int demux_mpg_read_packet(demuxer if(hdrlen>len){ MSG_V("demux_mpg: invalid header length \n"); return -1;} if(pts_flags==2 && hdrlen>=5){ c=stream_read_char(demux->stream); - pts=read_mpeg_timestamp(demux->stream,c,id); + pts=read_mpeg_timestamp(demux->stream,c); len-=5;hdrlen-=5; } else if(pts_flags==3 && hdrlen>=10){ c=stream_read_char(demux->stream); - pts=read_mpeg_timestamp(demux->stream,c,id); + pts=read_mpeg_timestamp(demux->stream,c); c=stream_read_char(demux->stream); - dts=read_mpeg_timestamp(demux->stream,c,id); + dts=read_mpeg_timestamp(demux->stream,c); len-=10;hdrlen-=10; } len-=hdrlen; @@ -382,12 +403,15 @@ static int demux_mpg_read_packet(demuxer else { demux_packet_t* dp; + sh_video_t *sh; if(ds->asf_packet) ds_add_packet(ds,ds->asf_packet); dp=new_demux_packet(len); len=stream_read(demux->stream,dp->buffer,len); resize_demux_packet(dp,len); dp->pts=pts/90000.0f; - dp->flags=DP_NONKEYFRAME; + if(ds==demux->video) sh=(sh_video_t *)ds->sh; + else sh=NULL; + dp->flags=sh?is_mpg_keyframe(sh->format,id,dp->buffer):DP_NONKEYFRAME; dp->pos=demux->filepos; ds->asf_packet=dp; } @@ -561,15 +585,15 @@ static void mpgps_seek(demuxer_t *demuxe } } i=sync_video_packet(d_video); - if(sh_video->format == 0x10000004) { //mpeg4 + if(sh_video->format == VIDEO_MPEG4) { if(i==0x1B6) { //vop (frame) startcode int pos = videobuf_len; if(!read_video_packet(d_video)) break; // EOF - if((videobuffer[pos+4] & 0x3F) == 0) break; //I-frame + if((videobuffer[pos+4] & 0x3F) == 0) break;//I-frame } - } else if(sh_video->format == 0x10000005){ //h264 + } else if(sh_video->format == VIDEO_H264){ if((i & ~0x60) == 0x101 || (i & ~0x60) == 0x102 || (i & ~0x60) == 0x105) break; - } else { //default mpeg1/2 + } else { //default VIDEO_MPEG1/VIDEO_MPEG2 if(i==0x1B3 || i==0x1B8) break; // found it! } if(!i || !skip_video_packet(d_video)) break; // EOF? @@ -779,7 +803,6 @@ static void mpgps_close(demuxer_t*demuxe static int mpgps_control(demuxer_t *demuxer,int cmd,void *arg) { - demux_stream_t *d_video=demuxer->video; mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demuxer->priv; switch(cmd) { @@ -787,7 +810,7 @@ static int mpgps_control(demuxer_t *demu if (mpg_d && mpg_d->num_a_streams > 1 && demuxer->audio && demuxer->audio->sh) { demux_stream_t *d_audio = demuxer->audio; sh_audio_t *sh_audio = d_audio->sh; - sh_audio_t *sh_a; + sh_audio_t *sh_a=NULL; int i; if (*((int*)arg) < 0) { Index: demux_nsv.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_nsv.c,v retrieving revision 1.3 retrieving revision 1.4 diff -p -u -d -r1.3 -r1.4 --- demux_nsv.c 14 Feb 2006 07:40:01 -0000 1.3 +++ demux_nsv.c 21 Feb 2006 17:14:15 -0000 1.4 @@ -7,6 +7,8 @@ * PCM needs extra audio chunk "miniheader" parsing * Based on A'rpis G2 work * Licence: GPL + * + * TODO: DP_KEYFRAME */ #include <stdio.h> Index: demux_nuv.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_nuv.c,v retrieving revision 1.12 retrieving revision 1.13 diff -p -u -d -r1.12 -r1.13 --- demux_nuv.c 14 Feb 2006 07:40:01 -0000 1.12 +++ demux_nuv.c 21 Feb 2006 17:14:15 -0000 1.13 @@ -6,6 +6,7 @@ * Reworked by alex TODO: demuxer->movi_length + TODO: DP_KEYFRAME */ Index: demux_pva.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_pva.c,v retrieving revision 1.9 retrieving revision 1.10 diff -p -u -d -r1.9 -r1.10 --- demux_pva.c 14 Feb 2006 07:40:01 -0000 1.9 +++ demux_pva.c 21 Feb 2006 17:14:15 -0000 1.10 @@ -15,6 +15,7 @@ * written by Matteo Giani TODO: demuxer->movi_length + TODO: DP_KEYFRAME */ Index: demux_roq.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_roq.c,v retrieving revision 1.9 retrieving revision 1.10 diff -p -u -d -r1.9 -r1.10 --- demux_roq.c 14 Feb 2006 07:40:01 -0000 1.9 +++ demux_roq.c 21 Feb 2006 17:14:15 -0000 1.10 @@ -5,6 +5,7 @@ http://www.csse.monash.edu.au/~timf/videocodec.html TODO: demuxer->movi_length + TODO: DP_KEYFRAME */ #include <stdio.h> Index: demux_smjpeg.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_smjpeg.c,v retrieving revision 1.6 retrieving revision 1.7 diff -p -u -d -r1.6 -r1.7 --- demux_smjpeg.c 14 Feb 2006 07:40:01 -0000 1.6 +++ demux_smjpeg.c 21 Feb 2006 17:14:15 -0000 1.7 @@ -8,6 +8,7 @@ http://www.lokigames.com/development/download/smjpeg/SMJPEG.txt TODO: demuxer->movi_length + TODO: DP_KEYFRAME */ #include <stdio.h> Index: demux_ts.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_ts.c,v retrieving revision 1.14 retrieving revision 1.15 diff -p -u -d -r1.14 -r1.15 --- demux_ts.c 14 Feb 2006 07:40:01 -0000 1.14 +++ demux_ts.c 21 Feb 2006 17:14:15 -0000 1.15 @@ -18,6 +18,8 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * TODO: DP_KEYFRAME */ Index: demux_viv.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_viv.c,v retrieving revision 1.12 retrieving revision 1.13 diff -p -u -d -r1.12 -r1.13 --- demux_viv.c 14 Feb 2006 07:40:01 -0000 1.12 +++ demux_viv.c 21 Feb 2006 17:14:15 -0000 1.13 @@ -2,6 +2,7 @@ VIVO file parser by A'rpi VIVO text header parser and audio support by alex TODO: demuxer->movi_length + TODO: DP_KEYFRAME */ #include <limits.h> #include <stdio.h> Index: demux_y4m.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_y4m.c,v retrieving revision 1.8 retrieving revision 1.9 diff -p -u -d -r1.8 -r1.9 --- demux_y4m.c 14 Feb 2006 07:40:01 -0000 1.8 +++ demux_y4m.c 21 Feb 2006 17:14:15 -0000 1.9 @@ -111,7 +111,7 @@ static int y4m_demux(demuxer_t *demux,de dp->pts=(float)priv->framenum/((sh_video_t*)ds->sh)->fps; priv->framenum++; dp->pos=demux->filepos; - dp->flags=DP_NONKEYFRAME; + dp->flags=DP_KEYFRAME; // every frame is keyframe ds_add_packet(ds, dp); return 1; |