changeset 18183:ac03acb92d24

introduced structures and code to keep track of decoder's buffers sizes
author nicodvb
date Sat, 22 Apr 2006 13:18:32 +0000
parents de01c9fbc1bc
children aefee7b47602
files libmpdemux/muxer_mpeg.c
diffstat 1 files changed, 88 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/muxer_mpeg.c	Sat Apr 22 13:17:23 2006 +0000
+++ b/libmpdemux/muxer_mpeg.c	Sat Apr 22 13:18:32 2006 +0000
@@ -115,6 +115,10 @@
 	} 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 @@
 	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 @@
 	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 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 @@
 	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 @@
   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;
 }