1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-25 16:33:02 +00:00

- multiple audio/video stream support fixed

- aid/vid autodetection (asf style - use id of first packet received)
- rv20 sub-packets support
- exporting codec id and sub-id to the codec, in bitmapinfoheader


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6345 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
arpi 2002-06-09 01:07:22 +00:00
parent cd356609ae
commit a5d9d1f303

View File

@ -8,6 +8,12 @@
TODO: fix the whole syncing mechanism
$Log$
Revision 1.13 2002/06/09 01:07:22 arpi
- multiple audio/video stream support fixed
- aid/vid autodetection (asf style - use id of first packet received)
- rv20 sub-packets support
- exporting codec id and sub-id to the codec, in bitmapinfoheader
Revision 1.12 2002/06/08 20:46:14 arpi
sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
(little cleanup and fprintf->mp_msg by me)
@ -81,8 +87,6 @@ typedef struct {
int num_of_packets;
int current_packet;
int current_aid;
int current_vid;
int current_apacket;
int current_vpacket;
@ -382,7 +386,10 @@ loop:
priv->current_packet++;
len -= 12;
// printf("s_id=%d aid=%d vid=%d \n",stream_id,demuxer->audio->id,demuxer->video->id);
/* check if stream_id is audio stream */
if(demuxer->audio->id==-1 || demuxer->audio->id==stream_id)
for (i = 0; i < priv->last_a_stream; i++)
{
if (priv->a_streams[i] == stream_id)
@ -391,10 +398,12 @@ loop:
ds = demuxer->audio; /* FIXME */
sh_audio = ds->sh;
priv->current_apacket++;
demuxer->audio->id=stream_id;
break;
}
}
/* check if stream_id is video stream */
if(demuxer->video->id==-1 || demuxer->video->id==stream_id)
for (i = 0; i < priv->last_v_stream; i++)
{
if (priv->v_streams[i] == stream_id)
@ -403,6 +412,7 @@ loop:
ds = demuxer->video; /* FIXME */
sh_video = ds->sh;
priv->current_vpacket++;
demuxer->video->id=stream_id;
break;
}
}
@ -446,7 +456,8 @@ loop:
ds_add_packet(ds, dp);
}
if (sh_video != NULL) {
if (sh_video->format==0x30335652 && 1) {
if (sh_video->format==0x30335652 ||
sh_video->format==0x30325652 ) {
// we need a more complicated demuxing
// a block may contain multiple packets
// as well as a packet may be contained in multiple blocks
@ -485,7 +496,12 @@ loop:
// bit 14 is always one (same applies to the offset)
vpkg_length=stream_read_word(demuxer->stream);
len-=2;
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X %0.2X ",vpkg_length>>8,vpkg_length&0xff);
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "l: %0.2X %0.2X ",vpkg_length>>8,vpkg_length&0xff);
if (vpkg_length==0) {
vpkg_length=stream_read_word(demuxer->stream);
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "l+: %0.2X %0.2X ",vpkg_length>>8,vpkg_length&0xff);
len-=2;
} else
vpkg_length&=0x3fff;
// offset of the following data inside the complete packet
@ -493,16 +509,16 @@ loop:
// _end_ of the packet, so it's equal to fragment size!!!
vpkg_offset=stream_read_word(demuxer->stream);
len-=2;
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X %0.2X ",vpkg_offset>>8,vpkg_offset&0xff);
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "o: %0.2X %0.2X ",vpkg_offset>>8,vpkg_offset&0xff);
if (vpkg_offset==0) {
vpkg_offset=stream_read_word(demuxer->stream);
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X %0.2X ",vpkg_offset>>8,vpkg_offset&0xff);
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "o+: %0.2X %0.2X ",vpkg_offset>>8,vpkg_offset&0xff);
len-=2;
}
} else
vpkg_offset&=0x3fff;
vpkg_seqnum=stream_read_char(demuxer->stream); --len;
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X ",vpkg_seqnum);
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "seq: %0.2X ",vpkg_seqnum);
}
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "\n");
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "blklen=%d\n", len);
@ -581,7 +597,17 @@ loop:
dp = new_demux_packet(len);
stream_read(demuxer->stream, dp->buffer, len);
dp->pts = timestamp/90000.0f;
#if 0
{ unsigned char* p=dp->buffer;
int i;
printf("\n#HDR# %04X",len);
for(i=0;i<20;i++) printf(" %02X",p[i]);
printf("\n");
if((p[0]&0x80)) printf("#HDR#\n");
}
#endif
dp->pts = timestamp/1000.0f;
dp->pos = demuxer->filepos;
dp->flags = (flags & 0x2) ? 0x10 : 0;
ds_add_packet(ds, dp);
@ -608,8 +634,6 @@ void demux_open_real(demuxer_t* demuxer)
num_of_headers = stream_read_dword(demuxer->stream);
// stream_skip(demuxer->stream, 4); /* number of headers */
priv->current_vid = priv->current_aid = -1;
/* parse chunks */
for (i = 1; i < num_of_headers; i++)
{
@ -858,14 +882,14 @@ void demux_open_real(demuxer_t* demuxer)
/* insert as stream */
demuxer->audio->sh = sh;
sh->ds = demuxer->audio;
demuxer->audio->id = stream_id;
// demuxer->audio->id = -1;//stream_id;
if (priv->last_a_stream+1 < MAX_STREAMS)
{
priv->a_streams[priv->last_a_stream] = stream_id;
priv->last_a_stream++;
}
priv->current_aid = stream_id;
// priv->current_aid = stream_id;
}
else
free(sh->wf);
@ -889,9 +913,9 @@ void demux_open_real(demuxer_t* demuxer)
mp_msg(MSGT_DEMUX,MSGL_V,"video fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format);
/* emulate BITMAPINFOHEADER */
sh->bih = malloc(sizeof(BITMAPINFOHEADER));
memset(sh->bih, 0, sizeof(BITMAPINFOHEADER));
sh->bih->biSize = 40;
sh->bih = malloc(sizeof(BITMAPINFOHEADER)+8);
memset(sh->bih, 0, sizeof(BITMAPINFOHEADER)+8);
sh->bih->biSize = 48;
sh->disp_w = sh->bih->biWidth = stream_read_word(demuxer->stream);
sh->disp_h = sh->bih->biHeight = stream_read_word(demuxer->stream);
sh->bih->biPlanes = 1;
@ -902,13 +926,20 @@ void demux_open_real(demuxer_t* demuxer)
sh->fps = stream_read_word(demuxer->stream);
sh->frametime = 1.0f/sh->fps;
stream_skip(demuxer->stream, 4);
stream_skip(demuxer->stream, 2);
stream_skip(demuxer->stream, 4);
stream_skip(demuxer->stream, 2);
#if 1
stream_skip(demuxer->stream, 8);
#else
printf("unknown1: 0x%X \n",stream_read_dword(demuxer->stream));
printf("unknown2: 0x%X \n",stream_read_word(demuxer->stream));
printf("unknown3: 0x%X \n",stream_read_word(demuxer->stream));
#endif
// read codec sub-format (to make difference between low and high rate codec)
((unsigned int*)(sh->bih+1))[0]=stream_read_dword(demuxer->stream);
/* h263 hack */
tmp = stream_read_dword(demuxer->stream);
((unsigned int*)(sh->bih+1))[1]=tmp;
mp_msg(MSGT_DEMUX,MSGL_V,"H.263 ID: %x\n", tmp);
switch (tmp)
{
@ -937,20 +968,29 @@ void demux_open_real(demuxer_t* demuxer)
/* insert as stream */
demuxer->video->sh = sh;
sh->ds = demuxer->video;
demuxer->video->id = stream_id;
// demuxer->video->id = -1; //stream_id;
if (priv->last_v_stream+1 < MAX_STREAMS)
{
priv->v_streams[priv->last_v_stream] = stream_id;
priv->last_v_stream++;
}
priv->current_vid = stream_id;
// priv->current_vid = stream_id;
}
// break;
// default:
skip_this_chunk:
/* skip codec info */
tmp = stream_tell(demuxer->stream) - codec_pos;
mp_msg(MSGT_DEMUX,MSGL_V,"### skipping %d bytes of codec info\n", codec_data_size - tmp);
#if 0
{ int i;
for(i=0;i<codec_data_size - tmp;i++)
printf(" %02X",stream_read_char(demuxer->stream));
printf("\n");
}
#else
stream_skip(demuxer->stream, codec_data_size - tmp);
#endif
break;
// }
}
@ -1005,7 +1045,7 @@ int demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, int flags)
sh_audio_t *sh_audio = d_audio->sh;
sh_video_t *sh_video = d_video->sh;
int video_chunk_pos = d_video->pos;
int vid = priv->current_vid, aid = priv->current_aid;
int vid = d_video->id, aid = d_audio->id;
int next_offset;
int rel_seek_frames = 0;
int streams = 0;