summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_real.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux/demux_real.c')
-rw-r--r--libmpdemux/demux_real.c128
1 files changed, 64 insertions, 64 deletions
diff --git a/libmpdemux/demux_real.c b/libmpdemux/demux_real.c
index 43e6297a19..b7d523f450 100644
--- a/libmpdemux/demux_real.c
+++ b/libmpdemux/demux_real.c
@@ -73,28 +73,28 @@ typedef struct {
/* for seeking */
int index_chunk_offset;
real_index_table_t *index_table[MAX_STREAMS];
-
+
// int *index_table[MAX_STREAMS];
int index_table_size[MAX_STREAMS];
int index_malloc_size[MAX_STREAMS];
int data_chunk_offset;
int num_of_packets;
int current_packet;
-
+
// need for seek
int audio_need_keyframe;
int video_after_seek;
int current_apacket;
int current_vpacket;
-
+
// timestamp correction:
int64_t kf_base;// timestamp of the prev. video keyframe
unsigned int kf_pts; // timestamp of next video keyframe
unsigned int a_pts; // previous audio timestamp
double v_pts; // previous video timestamp
unsigned long duration;
-
+
/* stream id table */
// int last_a_stream;
// int a_streams[MAX_STREAMS];
@@ -135,7 +135,7 @@ typedef struct {
static void get_str(int isbyte, demuxer_t *demuxer, char *buf, int buf_size)
{
int len;
-
+
if (isbyte)
len = stream_read_char(demuxer->stream);
else
@@ -156,13 +156,13 @@ static void dump_index(demuxer_t *demuxer, int stream_id)
if (!mp_msg_test(MSGT_DEMUX,MSGL_V))
return;
-
+
if ((unsigned)stream_id >= MAX_STREAMS)
return;
index = priv->index_table[stream_id];
entries = priv->index_table_size[stream_id];
-
+
mp_msg(MSGT_DEMUX, MSGL_V, "Index table for stream %d\n", stream_id);
for (i = 0; i < entries; i++)
{
@@ -211,10 +211,10 @@ read_index:
entries = stream_read_dword(demuxer->stream);
mp_msg(MSGT_DEMUX, MSGL_V,"entries: %d\n", entries);
-
+
stream_id = stream_read_word(demuxer->stream);
mp_msg(MSGT_DEMUX, MSGL_V,"stream_id: %d\n", stream_id);
-
+
next_header_pos = stream_read_dword(demuxer->stream);
mp_msg(MSGT_DEMUX, MSGL_V,"next_header_pos: %d\n", next_header_pos);
if (entries <= 0 || entries > MAX_INDEX_ENTRIES)
@@ -227,7 +227,7 @@ read_index:
priv->index_table_size[stream_id] = entries;
priv->index_table[stream_id] = calloc(priv->index_table_size[stream_id], sizeof(real_index_table_t));
-
+
for (i = 0; i < entries; i++)
{
stream_skip(demuxer->stream, 2); /* version */
@@ -238,7 +238,7 @@ read_index:
// printf("Index table: Stream#%d: entry: %d: pos: %d\n",
// stream_id, i, priv->index_table[stream_id][i].offset);
}
-
+
dump_index(demuxer, stream_id);
if (next_header_pos > 0)
@@ -300,7 +300,7 @@ static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int64_t se
while (1)
{
demuxer->filepos = stream_tell(demuxer->stream);
-
+
tag = stream_read_dword(demuxer->stream);
if (tag == MKTAG('A', 'T', 'A', 'D'))
{
@@ -310,16 +310,16 @@ static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int64_t se
len = tag & 0xffff;
if (tag == -256 || len < 12)
break;
-
+
stream_id = stream_read_word(demuxer->stream);
timestamp = stream_read_dword(demuxer->stream);
-
+
stream_skip(demuxer->stream, 1); /* reserved */
flags = stream_read_char(demuxer->stream);
-
+
if (flags == -256)
break;
-
+
if (flags & 2)
{
add_index_item(demuxer, stream_id, timestamp, demuxer->filepos);
@@ -342,7 +342,7 @@ static int generate_index(demuxer_t *demuxer)
int data_pos = priv->data_chunk_offset-10;
int i;
int tag;
-
+
stream_seek(demuxer->stream, data_pos);
tag = stream_read_dword(demuxer->stream);
if (tag != MKTAG('A', 'T', 'A', 'D'))
@@ -391,7 +391,7 @@ read_index:
}
stream_skip(demuxer->stream, 4); /* chunk size */
stream_skip(demuxer->stream, 2); /* version */
-
+
num_of_packets = stream_read_dword(demuxer->stream);
mp_msg(MSGT_DEMUX, MSGL_V,"Generating index table from raw data (pos: 0x%x) for %d packets\n",
data_pos, num_of_packets);
@@ -407,10 +407,10 @@ read_index:
}
tab_pos = 0;
-
+
// memset(priv->index_table_size, 0, sizeof(int)*MAX_STREAMS);
// memset(priv->index_table, 0, sizeof(real_index_table_t)*MAX_STREAMS);
-
+
while (tab_pos < num_of_packets)
{
i = stream_read_char(demuxer->stream);
@@ -422,7 +422,7 @@ read_index:
len = stream_read_word(demuxer->stream);
stream_id = stream_read_word(demuxer->stream);
timestamp = stream_read_dword(demuxer->stream);
-
+
stream_skip(demuxer->stream, 1); /* reserved */
flags = stream_read_char(demuxer->stream);
@@ -434,7 +434,7 @@ read_index:
// else
// priv->index_table[stream_id] = realloc(priv->index_table[stream_id],
// priv->index_table_size[stream_id] * sizeof(real_index_table_t));
-
+
priv->index_table[stream_id][i].timestamp = timestamp;
priv->index_table[stream_id][i].offset = stream_tell(demuxer->stream)-12;
priv->index_table[stream_id][i].len = len;
@@ -468,7 +468,7 @@ static int real_check_file(demuxer_t* demuxer)
int c;
mp_msg(MSGT_DEMUX,MSGL_V,"Checking for REAL\n");
-
+
c = stream_read_dword_le(demuxer->stream);
if (c == -256)
return 0; /* EOF */
@@ -620,17 +620,17 @@ static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
mp_msg(MSGT_DEMUX,MSGL_INFO,"demux_real: New data chunk is coming!!!\n");
if (priv->is_multirate)
return 0; // EOF
- stream_skip(demuxer->stream,14);
+ stream_skip(demuxer->stream,14);
demuxer->filepos = stream_tell(demuxer->stream);
version = stream_read_word(demuxer->stream); /* version */
- len = stream_read_word(demuxer->stream);
+ len = stream_read_word(demuxer->stream);
} else if ((version == 0x494e) && (len == 0x4458)) {
mp_msg(MSGT_DEMUX,MSGL_V,"demux_real: Found INDX chunk. EOF.\n");
demuxer->stream->eof=1;
return 0;
}
-
+
if (len == -256){ /* EOF */
// printf("len==-256!\n");
return 0;
@@ -676,7 +676,7 @@ static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
priv->current_packet, (int)demuxer->filepos, len, stream_id, timestamp, flags, reserved);
priv->current_packet++;
- len -= 12;
+ len -= 12;
// printf("s_id=%d aid=%d vid=%d \n",stream_id,demuxer->audio->id,demuxer->video->id);
@@ -858,19 +858,19 @@ got_audio:
if (priv->stream_switch)
priv->audio_curpos = stream_tell(demuxer->stream);
}
-
+
// If we're reordering audio packets and we need more data get it
if (audioreorder_getnextpk)
continue;
return 1;
}
-
+
if(demuxer->video->id==stream_id){
got_video:
ds=demuxer->video;
mp_dbg(MSGT_DEMUX,MSGL_DBG2, "packet is video (id: %d)\n", stream_id);
-
+
// parse video chunk:
{
// we need a more complicated, 2nd level demuxing, as the video
@@ -903,7 +903,7 @@ got_video:
vpkg_offset=0;
vpkg_length=len;
} else {
-
+
if (0==(vpkg_header&0x40)) {
// sub-seqnum (bits 0-6: number of fragment. bit 7: ???)
vpkg_subseq=stream_read_char(demuxer->stream);
@@ -1029,7 +1029,7 @@ got_video:
if (vpkg_length > len) {
mp_msg(MSGT_DEMUX, MSGL_WARN,"\n******** WARNING: vpkg_length=%i > len=%i ********\n", vpkg_length, len);
/*
- * To keep the video stream rolling, we need to break
+ * To keep the video stream rolling, we need to break
* here. We shouldn't touch len to make sure rest of the
* broken packet is skipped.
*/
@@ -1040,14 +1040,14 @@ got_video:
queue_video_packet(priv, ds, dp);
} // while(len>0)
-
+
if(len){
mp_msg(MSGT_DEMUX, MSGL_WARN,"\n******** !!!!!!!! BUG!! len=%d !!!!!!!!!!! ********\n",len);
if(len>0) stream_skip(demuxer->stream, len);
}
}
if ((unsigned)demuxer->video->id < MAX_STREAMS) {
- while (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id] &&
+ while (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id] &&
timestamp > priv->index_table[demuxer->video->id][priv->current_vpacket + 1].timestamp) {
priv->current_vpacket += 1;
priv->stream_switch = 1;
@@ -1117,7 +1117,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
// for (i = 1; ; i++)
{
int chunk_id, chunk_pos, chunk_size;
-
+
chunk_pos = stream_tell(demuxer->stream);
chunk_id = stream_read_dword_le(demuxer->stream);
chunk_size = stream_read_dword(demuxer->stream);
@@ -1126,12 +1126,12 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
mp_msg(MSGT_DEMUX,MSGL_V, "Chunk: %.4s (%x) (size: 0x%x, offset: 0x%x)\n",
(char *)&chunk_id, chunk_id, chunk_size, chunk_pos);
-
+
if (chunk_id != MKTAG('D', 'A', 'T', 'A') && chunk_size < 10){
mp_msg(MSGT_DEMUX,MSGL_ERR,"demux_real: invalid chunksize! (%d)\n",chunk_size);
break; //return;
}
-
+
switch(chunk_id)
{
case MKTAG('P', 'R', 'O', 'P'):
@@ -1154,7 +1154,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
#else
{
int flags = stream_read_word(demuxer->stream);
-
+
if (flags)
{
mp_msg(MSGT_DEMUX,MSGL_V,"Flags (%x): ", flags);
@@ -1229,7 +1229,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
stream_id = stream_read_word(demuxer->stream);
mp_msg(MSGT_DEMUX,MSGL_V,"Found new stream (id: %d)\n", stream_id);
-
+
stream_skip(demuxer->stream, 4); /* max bitrate */
bitrate = stream_read_dword(demuxer->stream); /* avg bitrate */
stream_skip(demuxer->stream, 4); /* max packet size */
@@ -1237,7 +1237,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
stream_skip(demuxer->stream, 4); /* start time */
stream_skip(demuxer->stream, 4); /* preroll */
stream_skip(demuxer->stream, 4); /* duration */
-
+
if ((len = stream_read_char(demuxer->stream)) > 0) {
descr = malloc(len+1);
stream_read(demuxer->stream, descr, len);
@@ -1251,7 +1251,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
mimet[len] = 0;
mp_msg(MSGT_DEMUX, MSGL_INFO,"Stream mimetype: %s\n", mimet);
}
-
+
/* Type specific header */
codec_data_size = stream_read_dword(demuxer->stream);
codec_pos = stream_tell(demuxer->stream);
@@ -1349,7 +1349,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
sub_packet_size = stream_read_word(demuxer->stream);
mp_msg(MSGT_DEMUX,MSGL_V,"sub_packet_size: %d\n", sub_packet_size);
stream_skip(demuxer->stream, 2); // 0
-
+
if (version == 5)
stream_skip(demuxer->stream, 6); //0,srate,0
@@ -1368,7 +1368,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
buf[4] = 0;
}
else
- {
+ {
/* Interleaver id */
get_str(1, demuxer, buf, sizeof(buf));
priv->intl_id[stream_id] = MKTAG(buf[0], buf[1], buf[2], buf[3]);
@@ -1406,9 +1406,9 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
case MKTAG('a', 't', 'r', 'c'):
case MKTAG('c', 'o', 'o', 'k'):
// realaudio codec plugins - common:
- stream_skip(demuxer->stream,3); // Skip 3 unknown bytes
+ stream_skip(demuxer->stream,3); // Skip 3 unknown bytes
if (version==5)
- stream_skip(demuxer->stream,1); // Skip 1 additional unknown byte
+ stream_skip(demuxer->stream,1); // Skip 1 additional unknown byte
codecdata_length=stream_read_dword(demuxer->stream);
// Check extradata len, we can't store bigger values in cbSize anyway
if ((unsigned)codecdata_length > 0xffff) {
@@ -1430,9 +1430,9 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
/* This is just AAC. The two or five bytes of */
/* config data needed for libfaad are stored */
/* after the audio headers. */
- stream_skip(demuxer->stream,3); // Skip 3 unknown bytes
+ stream_skip(demuxer->stream,3); // Skip 3 unknown bytes
if (version==5)
- stream_skip(demuxer->stream,1); // Skip 1 additional unknown byte
+ stream_skip(demuxer->stream,1); // Skip 1 additional unknown byte
codecdata_length=stream_read_dword(demuxer->stream);
if (codecdata_length>=1) {
sh->codecdata_len = codecdata_length - 1;
@@ -1453,7 +1453,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
priv->audiopk_size[stream_id] = frame_size;
sh->wf->wFormatTag = sh->format;
-
+
mp_msg(MSGT_DEMUX,MSGL_V,"audio fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format);
if ( mp_msg_test(MSGT_DEMUX,MSGL_V) )
print_wave_header(sh->wf, MSGL_V);
@@ -1472,7 +1472,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]);
priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double));
}
-
+
++a_streams;
#ifdef stream_skip
@@ -1493,12 +1493,12 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
sh->wf->nBlockAlign = 0;//frame_size;
sh->wf->cbSize = 0;
sh->wf->wFormatTag = sh->format = mmioFOURCC('a','d','u',0x55);
-
+
if(demuxer->audio->id==stream_id){
sh->ds=demuxer->audio;
demuxer->audio->sh=sh;
}
-
+
++a_streams;
} else if (strstr(mimet,"x-ralf-mpeg4")) {
mp_msg(MSGT_DEMUX,MSGL_ERR,"Real lossless audio not supported yet\n");
@@ -1536,7 +1536,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
sh->fps = (float) stream_read_word(demuxer->stream);
if (sh->fps<=0) sh->fps=24; // we probably won't even care about fps
sh->frametime = 1.0f/sh->fps;
-
+
#if 1
stream_skip(demuxer->stream, 4);
#else
@@ -1556,7 +1556,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
mp_msg(MSGT_DEMUX, MSGL_WARN,"realvid: ignoring FPS = %d\n",fps);
}
stream_skip(demuxer->stream, 2);
-
+
{
// read and store codec extradata
unsigned int cnt = codec_data_size - (stream_tell(demuxer->stream) - codec_pos);
@@ -1567,10 +1567,10 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
sh->bih->biSize += cnt;
stream_read(demuxer->stream, ((unsigned char*)(sh->bih+1)), cnt);
}
- }
+ }
if(sh->format == 0x30315652 && ((unsigned char*)(sh->bih+1))[6] == 0x30)
sh->bih->biCompression = sh->format = mmioFOURCC('R', 'V', '1', '3');
-
+
/* Select video stream with highest bitrate if multirate file*/
if (priv->is_multirate && ((demuxer->video->id == -1) ||
((demuxer->video->id >= 0) && priv->v_bitrate && (bitrate > priv->v_bitrate)))) {
@@ -1583,7 +1583,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
sh->ds=demuxer->video;
demuxer->video->sh=sh;
}
-
+
++v_streams;
}
@@ -1596,7 +1596,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
} else if (strstr(mimet,"-audio") || strstr(mimet,"-video")) {
int i, stream_cnt;
int stream_list[MAX_STREAMS];
-
+
priv->is_multirate = 1;
stream_skip(demuxer->stream, 4); // Length of codec data (repeated)
stream_cnt = stream_read_dword(demuxer->stream); // Get number of audio or video streams
@@ -1615,7 +1615,7 @@ static demuxer_t* demux_open_real(demuxer_t* demuxer)
mp_msg(MSGT_DEMUX,MSGL_V,"Stream %d with DATA offset 0x%08x\n", stream_list[i], priv->str_data_offset[stream_list[i]]);
}
// Skip the rest of this chunk
- } else
+ } else
mp_msg(MSGT_DEMUX,MSGL_V,"Unknown logical stream\n");
}
else {
@@ -1770,7 +1770,7 @@ static void demux_close_real(demuxer_t *demuxer)
{
int i;
real_priv_t* priv = demuxer->priv;
-
+
if (priv){
for(i=0; i<MAX_STREAMS; i++)
if(priv->index_table[i])
@@ -1836,7 +1836,7 @@ static void demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, float audio
else
break;
}
- }
+ }
else if (rel_seek_secs < 0) {
while ((cur_timestamp - priv->index_table[vid][priv->current_vpacket].timestamp) < - rel_seek_secs * 1000){
priv->current_vpacket -= 1;
@@ -1887,22 +1887,22 @@ static int demux_real_control(demuxer_t *demuxer, int cmd, void *arg)
{
real_priv_t *priv = demuxer->priv;
unsigned int lastpts = priv->v_pts ? priv->v_pts : priv->a_pts;
-
+
switch (cmd) {
case DEMUXER_CTRL_GET_TIME_LENGTH:
if (priv->duration == 0)
return DEMUXER_CTRL_DONTKNOW;
-
+
*((double *)arg) = (double)priv->duration;
return DEMUXER_CTRL_OK;
case DEMUXER_CTRL_GET_PERCENT_POS:
if (priv->duration == 0)
return DEMUXER_CTRL_DONTKNOW;
-
+
*((int *)arg) = (int)(100 * lastpts / priv->duration);
return DEMUXER_CTRL_OK;
-
+
default:
return DEMUXER_CTRL_NOTIMPL;
}