mirror of
https://github.com/mpv-player/mpv
synced 2025-03-21 02:41:13 +00:00
fixed FPS as well as crash bug when no audio chunks are present
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4533 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
f4d53cd1f1
commit
e9d210d59e
@ -26,7 +26,7 @@
|
|||||||
#define CHUNK_TYPE_AUDIO 0
|
#define CHUNK_TYPE_AUDIO 0
|
||||||
#define CHUNK_TYPE_VIDEO 1
|
#define CHUNK_TYPE_VIDEO 1
|
||||||
|
|
||||||
#define RoQ_FPS 24
|
#define RoQ_FPS 30
|
||||||
|
|
||||||
typedef struct roq_chunk_t
|
typedef struct roq_chunk_t
|
||||||
{
|
{
|
||||||
@ -101,7 +101,6 @@ demuxer_t* demux_open_roq(demuxer_t* demuxer)
|
|||||||
int chunk_id;
|
int chunk_id;
|
||||||
int chunk_size;
|
int chunk_size;
|
||||||
int chunk_arg;
|
int chunk_arg;
|
||||||
int chunk_counter = 0;
|
|
||||||
int last_chunk_id = 0;
|
int last_chunk_id = 0;
|
||||||
int largest_audio_chunk = 0;
|
int largest_audio_chunk = 0;
|
||||||
|
|
||||||
@ -145,8 +144,8 @@ demuxer_t* demux_open_roq(demuxer_t* demuxer)
|
|||||||
sh_video->format = mmioFOURCC('R', 'o', 'Q', 'V');
|
sh_video->format = mmioFOURCC('R', 'o', 'Q', 'V');
|
||||||
|
|
||||||
// constant frame rate
|
// constant frame rate
|
||||||
sh_video->fps = RoQ_FPS;
|
sh_video->fps = 1000 / RoQ_FPS;
|
||||||
sh_video->frametime = 1 / RoQ_FPS;
|
sh_video->frametime = 1 / sh_video->fps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((chunk_id == RoQ_SOUND_MONO) ||
|
else if ((chunk_id == RoQ_SOUND_MONO) ||
|
||||||
@ -179,12 +178,12 @@ demuxer_t* demux_open_roq(demuxer_t* demuxer)
|
|||||||
|
|
||||||
// index the chunk
|
// index the chunk
|
||||||
roq_data->chunks = (roq_chunk_t *)realloc(roq_data->chunks,
|
roq_data->chunks = (roq_chunk_t *)realloc(roq_data->chunks,
|
||||||
(chunk_counter + 1) * sizeof (roq_chunk_t));
|
(roq_data->total_chunks + 1) * sizeof (roq_chunk_t));
|
||||||
roq_data->chunks[chunk_counter].chunk_type = CHUNK_TYPE_AUDIO;
|
roq_data->chunks[roq_data->total_chunks].chunk_type = CHUNK_TYPE_AUDIO;
|
||||||
roq_data->chunks[chunk_counter].chunk_offset =
|
roq_data->chunks[roq_data->total_chunks].chunk_offset =
|
||||||
stream_tell(demuxer->stream) - 8;
|
stream_tell(demuxer->stream) - 8;
|
||||||
roq_data->chunks[chunk_counter].chunk_size = chunk_size + 8;
|
roq_data->chunks[roq_data->total_chunks].chunk_size = chunk_size + 8;
|
||||||
roq_data->chunks[chunk_counter].running_audio_sample_count =
|
roq_data->chunks[roq_data->total_chunks].running_audio_sample_count =
|
||||||
roq_data->total_audio_sample_count;
|
roq_data->total_audio_sample_count;
|
||||||
|
|
||||||
// audio housekeeping
|
// audio housekeeping
|
||||||
@ -194,7 +193,7 @@ demuxer_t* demux_open_roq(demuxer_t* demuxer)
|
|||||||
(chunk_size / sh_audio->wf->nChannels);
|
(chunk_size / sh_audio->wf->nChannels);
|
||||||
|
|
||||||
stream_skip(demuxer->stream, chunk_size);
|
stream_skip(demuxer->stream, chunk_size);
|
||||||
chunk_counter++;
|
roq_data->total_chunks++;
|
||||||
}
|
}
|
||||||
else if ((chunk_id == RoQ_QUAD_CODEBOOK) ||
|
else if ((chunk_id == RoQ_QUAD_CODEBOOK) ||
|
||||||
((chunk_id == RoQ_QUAD_VQ) && (last_chunk_id != RoQ_QUAD_CODEBOOK)))
|
((chunk_id == RoQ_QUAD_VQ) && (last_chunk_id != RoQ_QUAD_CODEBOOK)))
|
||||||
@ -202,25 +201,25 @@ demuxer_t* demux_open_roq(demuxer_t* demuxer)
|
|||||||
// index a new chunk if it's a codebook or quad VQ not following a
|
// index a new chunk if it's a codebook or quad VQ not following a
|
||||||
// codebook
|
// codebook
|
||||||
roq_data->chunks = (roq_chunk_t *)realloc(roq_data->chunks,
|
roq_data->chunks = (roq_chunk_t *)realloc(roq_data->chunks,
|
||||||
(chunk_counter + 1) * sizeof (roq_chunk_t));
|
(roq_data->total_chunks + 1) * sizeof (roq_chunk_t));
|
||||||
roq_data->chunks[chunk_counter].chunk_type = CHUNK_TYPE_VIDEO;
|
roq_data->chunks[roq_data->total_chunks].chunk_type = CHUNK_TYPE_VIDEO;
|
||||||
roq_data->chunks[chunk_counter].chunk_offset =
|
roq_data->chunks[roq_data->total_chunks].chunk_offset =
|
||||||
stream_tell(demuxer->stream) - 8;
|
stream_tell(demuxer->stream) - 8;
|
||||||
roq_data->chunks[chunk_counter].chunk_size = chunk_size + 8;
|
roq_data->chunks[roq_data->total_chunks].chunk_size = chunk_size + 8;
|
||||||
roq_data->chunks[chunk_counter].video_chunk_number =
|
roq_data->chunks[roq_data->total_chunks].video_chunk_number =
|
||||||
roq_data->total_video_chunks++;
|
roq_data->total_video_chunks++;
|
||||||
|
|
||||||
stream_skip(demuxer->stream, chunk_size);
|
stream_skip(demuxer->stream, chunk_size);
|
||||||
chunk_counter++;
|
roq_data->total_chunks++;
|
||||||
}
|
}
|
||||||
else if ((chunk_id == RoQ_QUAD_VQ) && (last_chunk_id == RoQ_QUAD_CODEBOOK))
|
else if ((chunk_id == RoQ_QUAD_VQ) && (last_chunk_id == RoQ_QUAD_CODEBOOK))
|
||||||
{
|
{
|
||||||
// if it's a quad VQ chunk following a codebook chunk, extend the last
|
// if it's a quad VQ chunk following a codebook chunk, extend the last
|
||||||
// chunk
|
// chunk
|
||||||
roq_data->chunks[chunk_counter - 1].chunk_size += (chunk_size + 8);
|
roq_data->chunks[roq_data->total_chunks - 1].chunk_size += (chunk_size + 8);
|
||||||
stream_skip(demuxer->stream, chunk_size);
|
stream_skip(demuxer->stream, chunk_size);
|
||||||
}
|
}
|
||||||
else
|
else if (!stream_eof(demuxer->stream))
|
||||||
{
|
{
|
||||||
mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Unknown RoQ chunk ID: %04X\n", chunk_id);
|
mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Unknown RoQ chunk ID: %04X\n", chunk_id);
|
||||||
}
|
}
|
||||||
@ -232,14 +231,16 @@ demuxer_t* demux_open_roq(demuxer_t* demuxer)
|
|||||||
// in the DPCM encoding effectively represents 1 16-bit sample
|
// in the DPCM encoding effectively represents 1 16-bit sample
|
||||||
// (store it in wf->nBlockAlign for the time being since init_audio() will
|
// (store it in wf->nBlockAlign for the time being since init_audio() will
|
||||||
// step on it anyway)
|
// step on it anyway)
|
||||||
sh_audio->wf->nBlockAlign = largest_audio_chunk * 2;
|
if (sh_audio)
|
||||||
|
sh_audio->wf->nBlockAlign = largest_audio_chunk * 2;
|
||||||
|
|
||||||
roq_data->total_chunks = chunk_counter;
|
|
||||||
roq_data->current_chunk = 0;
|
roq_data->current_chunk = 0;
|
||||||
|
|
||||||
demuxer->priv = roq_data;
|
demuxer->priv = roq_data;
|
||||||
|
|
||||||
stream_reset(demuxer->stream);
|
stream_reset(demuxer->stream);
|
||||||
|
|
||||||
|
sh_audio = NULL;
|
||||||
|
|
||||||
return demuxer;
|
return demuxer;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user