summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authornicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-04-22 13:18:32 +0000
committernicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-04-22 13:18:32 +0000
commit2c06ca54a2239e249a83a6c6afcb13dbe5817704 (patch)
tree03c5992d695f9ab314a47c9eabecfc9c314fb72f /libmpdemux
parent1d8757fb7d60399a49af57fe2809b786df82fb67 (diff)
downloadmpv-2c06ca54a2239e249a83a6c6afcb13dbe5817704.tar.bz2
mpv-2c06ca54a2239e249a83a6c6afcb13dbe5817704.tar.xz
introduced structures and code to keep track of decoder's buffers sizes
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18184 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/muxer_mpeg.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/libmpdemux/muxer_mpeg.c b/libmpdemux/muxer_mpeg.c
index 47895d5db3..2274e0595b 100644
--- a/libmpdemux/muxer_mpeg.c
+++ b/libmpdemux/muxer_mpeg.c
@@ -115,6 +115,10 @@ typedef struct {
} streams[50]; //16 video + 16 audio mpa + 16 audio private + bd/bf for dvd
} psm_info_t;
+typedef struct {
+ int size;
+ uint64_t dts;
+} buffer_track_t;
typedef struct {
int mux;
@@ -125,6 +129,7 @@ typedef struct {
int update_system_header, use_psm;
off_t headers_size, data_size;
uint64_t scr, vbytes, abytes, init_delay_pts;
+ uint64_t delta_scr;
uint32_t muxrate;
uint8_t *buff, *tmp, *abuf;
uint32_t headers_cnt;
@@ -160,6 +165,13 @@ typedef struct {
uint64_t vframes;
uint8_t trf;
mp_mpeg_header_t picture;
+ int max_buffer_size;
+ buffer_track_t *buffer_track;
+ int track_pos, track_len, track_bufsize; //pos and len control the array, bufsize is the size of the buffer
+ unsigned char *pack;
+ int pack_offset, pes_offset, pes_set, payload_offset;
+ int frames;
+ int last_frame_rest; //the rest of the previous frame
int is_ready;
} muxer_headers_t;
@@ -939,6 +951,42 @@ static int write_mpeg_pack(muxer_t *muxer, muxer_stream_t *s, FILE *f, char *bl,
}
}
+static int update_demux_bufsize(muxer_headers_t *spriv, uint64_t dts, int framelen, int type)
+{
+ int dim = (spriv->track_len+16)*sizeof(buffer_track_t);
+
+ if(spriv->track_pos+1 >= spriv->track_len)
+ {
+ buffer_track_t *tmp = realloc(spriv->buffer_track, dim);
+ if(!tmp)
+ {
+ mp_msg(MSGT_MUXER, MSGL_ERR, "\r\nERROR, couldn't realloc %d bytes for tracking buffer\r\n", dim);
+ return 0;
+ }
+ spriv->buffer_track = tmp;
+ memset(&(spriv->buffer_track[spriv->track_pos+1]), 0, 16*sizeof(buffer_track_t));
+ spriv->track_len += 16;
+ }
+
+ spriv->buffer_track[spriv->track_pos].size = framelen;
+ spriv->buffer_track[spriv->track_pos].dts = dts; //must be dts
+
+ spriv->track_pos++;
+}
+
+static void inline remove_frames(muxer_headers_t *spriv, int n)
+{
+ mpeg_frame_t tmp;
+ int i;
+
+ for(i = n; i < spriv->framebuf_used; i++)
+ {
+ tmp = spriv->framebuf[i - n];
+ spriv->framebuf[i - n] = spriv->framebuf[i];
+ spriv->framebuf[i] = tmp;
+ }
+ spriv->framebuf_used -= n;
+}
static void patch_seq(muxer_priv_t *priv, unsigned char *buf)
{
@@ -2259,6 +2307,45 @@ static int parse_audio(muxer_stream_t *s, int finalize, unsigned int *nf, double
return tot;
}
+static void fix_parameters(muxer_stream_t *stream)
+{
+ muxer_headers_t *spriv = stream->priv;
+ muxer_t *muxer = stream->muxer;
+ muxer_priv_t *priv = muxer->priv;
+
+ if(stream->type == MUXER_TYPE_AUDIO)
+ {
+ spriv->max_buffer_size = 4*1024;
+ if(stream->wf->wFormatTag == AUDIO_A52)
+ {
+ stream->ckid = be2me_32 (0x1bd);
+ if(priv->is_genmpeg1 || priv->is_genmpeg2)
+ fix_audio_sys_header(priv, spriv->id, 0xbd, 58*1024); //only one audio at the moment
+ spriv->id = 0xbd;
+ spriv->max_buffer_size = 16*1024;
+ }
+ else if(stream->wf->wFormatTag == AUDIO_AAC1 || stream->wf->wFormatTag == AUDIO_AAC2)
+ {
+ priv->use_psm = 1;
+ }
+ }
+ else //video
+ {
+ if(priv->is_dvd)
+ spriv->max_buffer_size = 232*1024;
+ else if(priv->is_xsvcd)
+ spriv->max_buffer_size = 230*1024;
+ else if(priv->is_xvcd)
+ spriv->max_buffer_size = 46*1024;
+ else
+ spriv->max_buffer_size = 232*1024; //no profile => unconstrained :) FIXME!!!
+
+ if(is_mpeg4(stream->bih->biCompression))
+ spriv->is_ready = 0;
+ else
+ spriv->is_ready = 1;
+ }
+}
static void mpegfile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags, double dts_arg, double pts_arg){
@@ -2640,6 +2727,7 @@ int muxer_init_muxer_mpeg(muxer_t *muxer){
muxer->cont_write_chunk = &mpegfile_write_chunk;
muxer->cont_write_header = &mpegfile_write_header;
muxer->cont_write_index = &mpegfile_write_index;
+ muxer->fix_stream_parameters = &fix_parameters;
return 1;
}