Commit d9069191 authored by Gildas Bazin's avatar Gildas Bazin

* src/stream_output/stream_output.c, include/stream_output.h: added an i_padding field to sout_instance_t so we can allocate sout_buffers with a bit more space than asked for (needed for ffmpeg decoding).
* modules/stream_out/transcode.c: proper pts/dts generation. This allows the transcoder module to finally generate proper streams.
   Added support for b frames (bframe=x option) + couple of bug fixes.
parent b3b99a16
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* stream_output.h : stream output module * stream_output.h : stream output module
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: stream_output.h,v 1.11 2003/07/31 19:14:59 fenrir Exp $ * $Id: stream_output.h,v 1.12 2003/08/09 14:59:24 gbazin Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* Laurent Aimar <fenrir@via.ecp.fr> * Laurent Aimar <fenrir@via.ecp.fr>
...@@ -243,6 +243,8 @@ struct sout_instance_t ...@@ -243,6 +243,8 @@ struct sout_instance_t
/* muxer data */ /* muxer data */
int i_preheader; /* max over all muxer */ int i_preheader; /* max over all muxer */
int i_padding; /* needed by some decoders */
vlc_mutex_t lock; vlc_mutex_t lock;
sout_stream_t *p_stream; sout_stream_t *p_stream;
......
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* stream_output.c : stream output module * stream_output.c : stream output module
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: stream_output.c,v 1.32 2003/08/01 18:42:56 fenrir Exp $ * $Id: stream_output.c,v 1.33 2003/08/09 14:59:24 gbazin Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* Laurent Aimar <fenrir@via.ecp.fr> * Laurent Aimar <fenrir@via.ecp.fr>
...@@ -85,6 +85,7 @@ sout_instance_t * __sout_NewInstance ( vlc_object_t *p_parent, ...@@ -85,6 +85,7 @@ sout_instance_t * __sout_NewInstance ( vlc_object_t *p_parent,
/* *** init descriptor *** */ /* *** init descriptor *** */
p_sout->psz_sout = strdup( psz_dest ); p_sout->psz_sout = strdup( psz_dest );
p_sout->i_preheader = 0; p_sout->i_preheader = 0;
p_sout->i_padding = 0;
p_sout->p_sys = NULL; p_sout->p_sys = NULL;
vlc_mutex_init( p_sout, &p_sout->lock ); vlc_mutex_init( p_sout, &p_sout->lock );
...@@ -504,7 +505,7 @@ sout_fifo_t *sout_FifoCreate( sout_instance_t *p_sout ) ...@@ -504,7 +505,7 @@ sout_fifo_t *sout_FifoCreate( sout_instance_t *p_sout )
return( p_fifo ); return( p_fifo );
} }
void sout_FifoFree( sout_instance_t *p_sout, sout_fifo_t *p_fifo ) void sout_FifoFree( sout_instance_t *p_sout, sout_fifo_t *p_fifo )
{ {
sout_buffer_t *p_buffer; sout_buffer_t *p_buffer;
...@@ -521,7 +522,7 @@ void sout_FifoFree( sout_instance_t *p_sout, sout_fifo_t *p_fifo ) ...@@ -521,7 +522,7 @@ void sout_FifoFree( sout_instance_t *p_sout, sout_fifo_t *p_fifo )
return; return;
} }
void sout_FifoDestroy( sout_instance_t *p_sout, sout_fifo_t *p_fifo ) void sout_FifoDestroy( sout_instance_t *p_sout, sout_fifo_t *p_fifo )
{ {
sout_FifoFree( p_sout, p_fifo ); sout_FifoFree( p_sout, p_fifo );
vlc_mutex_destroy( &p_fifo->lock ); vlc_mutex_destroy( &p_fifo->lock );
...@@ -530,7 +531,7 @@ void sout_FifoDestroy( sout_instance_t *p_sout, sout_fifo_t *p_fifo ) ...@@ -530,7 +531,7 @@ void sout_FifoDestroy( sout_instance_t *p_sout, sout_fifo_t *p_fifo )
free( p_fifo ); free( p_fifo );
} }
void sout_FifoPut( sout_fifo_t *p_fifo, sout_buffer_t *p_buffer ) void sout_FifoPut( sout_fifo_t *p_fifo, sout_buffer_t *p_buffer )
{ {
vlc_mutex_lock( &p_fifo->lock ); vlc_mutex_lock( &p_fifo->lock );
...@@ -597,26 +598,33 @@ sout_buffer_t *sout_FifoShow( sout_fifo_t *p_fifo ) ...@@ -597,26 +598,33 @@ sout_buffer_t *sout_FifoShow( sout_fifo_t *p_fifo )
sout_buffer_t *sout_BufferNew( sout_instance_t *p_sout, size_t i_size ) sout_buffer_t *sout_BufferNew( sout_instance_t *p_sout, size_t i_size )
{ {
sout_buffer_t *p_buffer; sout_buffer_t *p_buffer;
size_t i_preheader; size_t i_preheader, i_padding;
#ifdef DEBUG_BUFFER
msg_Dbg( p_sout, "allocating an new buffer, size:%d", (uint32_t)i_size );
#endif
p_buffer = malloc( sizeof( sout_buffer_t ) ); p_buffer = malloc( sizeof( sout_buffer_t ) );
i_preheader = p_sout->i_preheader; i_preheader = p_sout->i_preheader;
i_padding = p_sout->i_padding;
#ifdef DEBUG_BUFFER
msg_Dbg( p_sout, "allocating an new buffer, size:%d, preheader:%d, "
"padding:%d", (uint32_t)i_size, i_preheader, i_padding );
#endif
if( i_size > 0 ) if( i_size > 0 )
{ {
p_buffer->p_allocated_buffer = malloc( i_size + i_preheader ); p_buffer->p_allocated_buffer =
malloc( i_size + i_preheader + i_padding );
p_buffer->p_buffer = p_buffer->p_allocated_buffer + i_preheader; p_buffer->p_buffer = p_buffer->p_allocated_buffer + i_preheader;
if( p_buffer->p_allocated_buffer && i_padding )
memset( p_buffer->p_allocated_buffer + i_size + i_preheader, 0,
i_padding );
} }
else else
{ {
p_buffer->p_allocated_buffer = NULL; p_buffer->p_allocated_buffer = NULL;
p_buffer->p_buffer = NULL; p_buffer->p_buffer = NULL;
} }
p_buffer->i_allocated_size = i_size + i_preheader; p_buffer->i_allocated_size = i_size + i_preheader + i_padding;
p_buffer->i_buffer_size = i_size; p_buffer->i_buffer_size = i_size;
p_buffer->i_size = i_size; p_buffer->i_size = i_size;
...@@ -629,20 +637,25 @@ sout_buffer_t *sout_BufferNew( sout_instance_t *p_sout, size_t i_size ) ...@@ -629,20 +637,25 @@ sout_buffer_t *sout_BufferNew( sout_instance_t *p_sout, size_t i_size )
return( p_buffer ); return( p_buffer );
} }
int sout_BufferRealloc( sout_instance_t *p_sout, sout_buffer_t *p_buffer, size_t i_size )
int sout_BufferRealloc( sout_instance_t *p_sout, sout_buffer_t *p_buffer,
size_t i_size )
{ {
size_t i_preheader; size_t i_preheader, i_padding;
i_preheader = p_buffer->p_buffer - p_buffer->p_allocated_buffer;
i_padding = p_buffer->i_allocated_size - p_buffer->i_buffer_size
- i_preheader;
#ifdef DEBUG_BUFFER #ifdef DEBUG_BUFFER
msg_Dbg( p_sout, msg_Dbg( p_sout, "realloc buffer old size:%d new size:%d, preheader:%d, "
"realloc buffer old size:%d new size:%d", "padding:%d", (uint32_t)p_buffer->i_allocated_size,
(uint32_t)p_buffer->i_allocated_size, (uint32_t)i_size, i_preheader, i_padding );
(uint32_t)i_size );
#endif #endif
i_preheader = p_buffer->p_buffer - p_buffer->p_allocated_buffer; if( !( p_buffer->p_allocated_buffer =
realloc( p_buffer->p_allocated_buffer,
if( !( p_buffer->p_allocated_buffer = realloc( p_buffer->p_allocated_buffer, i_size + i_preheader ) ) ) i_size + i_preheader + i_padding ) ) )
{ {
msg_Err( p_sout, "realloc failed" ); msg_Err( p_sout, "realloc failed" );
p_buffer->i_allocated_size = 0; p_buffer->i_allocated_size = 0;
...@@ -653,15 +666,20 @@ int sout_BufferRealloc( sout_instance_t *p_sout, sout_buffer_t *p_buffer, size_t ...@@ -653,15 +666,20 @@ int sout_BufferRealloc( sout_instance_t *p_sout, sout_buffer_t *p_buffer, size_t
} }
p_buffer->p_buffer = p_buffer->p_allocated_buffer + i_preheader; p_buffer->p_buffer = p_buffer->p_allocated_buffer + i_preheader;
p_buffer->i_allocated_size = i_size + i_preheader; p_buffer->i_allocated_size = i_size + i_preheader + i_padding;
p_buffer->i_buffer_size = i_size; p_buffer->i_buffer_size = i_size;
if( i_padding )
memset( p_buffer->p_allocated_buffer + i_size + i_preheader, 0,
i_padding );
return( 0 ); return( 0 );
} }
int sout_BufferReallocFromPreHeader( sout_instance_t *p_sout, sout_buffer_t *p_buffer, size_t i_size ) int sout_BufferReallocFromPreHeader( sout_instance_t *p_sout,
sout_buffer_t *p_buffer, size_t i_size )
{ {
size_t i_preheader; size_t i_preheader;
i_preheader = p_buffer->p_buffer - p_buffer->p_allocated_buffer; i_preheader = p_buffer->p_buffer - p_buffer->p_allocated_buffer;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment