Commit 8470508b authored by Laurent Aimar's avatar Laurent Aimar

* all: use p_vlc->pf_memcpy instead of memcpy on big data block.

 * mpeg4video: removed a bad code dealing with pts discontinuity.
 * pes.c: try to avoid copying the whole  PES. (the first 64ko
ins't any more copied :)
parent 6da4dafa
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* pes.c * pes.c
***************************************************************************** *****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN * Copyright (C) 2001, 2002 VideoLAN
* $Id: pes.c,v 1.3 2003/01/08 10:34:58 fenrir Exp $ * $Id: pes.c,v 1.4 2003/01/17 15:26:24 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Eric Petit <titer@videolan.org> * Eric Petit <titer@videolan.org>
...@@ -46,73 +46,17 @@ ...@@ -46,73 +46,17 @@
#include "pes.h" #include "pes.h"
#include "bits.h" #include "bits.h"
int E_( EStoPES )( sout_instance_t *p_sout, #define PES_PAYLOAD_SIZE_MAX 65500
sout_buffer_t **pp_pes,
sout_buffer_t *p_es, static inline int PESHeader( uint8_t *p_hdr, mtime_t i_pts, mtime_t i_dts, int i_es_size, int i_stream_id, int i_private_id )
int i_stream_id,
int b_mpeg2 )
{ {
sout_buffer_t *p_pes;
bits_buffer_t bits; bits_buffer_t bits;
mtime_t i_pts, i_dts;
uint8_t *p_data;
int i_size;
int i_private_id;
/* HACK for private stream 1 in ps */
if( ( i_stream_id&0xff00 ) == 0xbd00 )
{
i_private_id = i_stream_id & 0xff;
i_stream_id = PES_PRIVATE_STREAM_1;
}
else
{
i_private_id = -1;
}
i_pts = p_es->i_pts * 9 / 100; // 90000 units clock
i_dts = p_es->i_dts * 9 / 100; // 90000 units clock
i_size = p_es->i_size;
p_data = p_es->p_buffer;
*pp_pes = p_pes = NULL;
do
{
int i_copy;
i_copy = __MIN( i_size, 65500 );
if( *pp_pes == NULL )
{
*pp_pes = p_pes = sout_BufferNew( p_sout, 100 + i_copy);
p_pes->i_dts = p_es->i_dts;
p_pes->i_pts = p_es->i_pts;
p_pes->i_length = p_es->i_length;
}
else
{
p_pes->p_next = sout_BufferNew( p_sout, 100 + i_copy );
p_pes = p_pes->p_next;
p_pes->i_dts = 0;
p_pes->i_pts = 0;
p_pes->i_length = 0;
}
p_pes->i_size = 0;
bits_initwrite( &bits, 30, p_hdr );
bits_initwrite( &bits, 100, p_pes->p_buffer ); /* add start code */
/* first 4 bytes common pes header */
/* add start code for pes 0x000001 */
bits_write( &bits, 24, 0x01 ); bits_write( &bits, 24, 0x01 );
/* add stream id */
bits_write( &bits, 8, i_stream_id ); bits_write( &bits, 8, i_stream_id );
switch( i_stream_id ) switch( i_stream_id )
{ {
case PES_PROGRAM_STREAM_MAP: case PES_PROGRAM_STREAM_MAP:
...@@ -124,17 +68,18 @@ int E_( EStoPES )( sout_instance_t *p_sout, ...@@ -124,17 +68,18 @@ int E_( EStoPES )( sout_instance_t *p_sout,
case PES_DSMCC_STREAM: case PES_DSMCC_STREAM:
case PES_ITU_T_H222_1_TYPE_E_STREAM: case PES_ITU_T_H222_1_TYPE_E_STREAM:
/* add pes data size */ /* add pes data size */
bits_write( &bits, 16, i_copy ); bits_write( &bits, 16, i_es_size );
bits_align( &bits ); bits_align( &bits );
break; return( bits.i_data );
default: default:
/* arg, a little more difficult */ /* arg, a little more difficult */
if( b_mpeg2 ) // if( b_mpeg2 ) // FIXME unsupported
{ {
int i_pts_dts; int i_pts_dts;
int i_extra; int i_extra = 0;
/* *** for PES_PRIVATE_STREAM_1 there is an extra header after the pes hdr *** */
if( i_stream_id == PES_PRIVATE_STREAM_1 ) if( i_stream_id == PES_PRIVATE_STREAM_1 )
{ {
i_extra = 1; i_extra = 1;
...@@ -143,19 +88,15 @@ int E_( EStoPES )( sout_instance_t *p_sout, ...@@ -143,19 +88,15 @@ int E_( EStoPES )( sout_instance_t *p_sout,
i_extra += 3; i_extra += 3;
} }
} }
else
{
i_extra = 0;
}
if( i_dts > 0 ) if( i_dts >= 0 )
{ {
bits_write( &bits, 16, i_copy + i_extra+ 13 ); bits_write( &bits, 16, i_es_size + i_extra+ 13 );
i_pts_dts = 0x03; i_pts_dts = 0x03;
} }
else else
{ {
bits_write( &bits, 16, i_copy + i_extra + 8 ); bits_write( &bits, 16, i_es_size + i_extra + 8 );
i_pts_dts = 0x02; i_pts_dts = 0x02;
} }
...@@ -201,14 +142,7 @@ int E_( EStoPES )( sout_instance_t *p_sout, ...@@ -201,14 +142,7 @@ int E_( EStoPES )( sout_instance_t *p_sout,
bits_write( &bits, 1, 0x01 ); // marker bits_write( &bits, 1, 0x01 ); // marker
bits_write( &bits, 15, i_dts ); bits_write( &bits, 15, i_dts );
bits_write( &bits, 1, 0x01 ); // marker bits_write( &bits, 1, 0x01 ); // marker
i_dts = 0; // write dts only once
} }
}
else
{
msg_Warn( p_sout, "es isn't mpeg2 -->corrupted pes" );
} }
/* now should be stuffing */ /* now should be stuffing */
/* and then pes data */ /* and then pes data */
...@@ -222,22 +156,95 @@ int E_( EStoPES )( sout_instance_t *p_sout, ...@@ -222,22 +156,95 @@ int E_( EStoPES )( sout_instance_t *p_sout,
bits_write( &bits, 24, 0 ); // ac3 bits_write( &bits, 24, 0 ); // ac3
} }
} }
break; bits_align( &bits );
return( bits.i_data );
} }
}
int E_( EStoPES )( sout_instance_t *p_sout,
sout_buffer_t **pp_pes,
sout_buffer_t *p_es,
int i_stream_id,
int b_mpeg2 )
{
sout_buffer_t *p_es_sav, *p_pes;
mtime_t i_pts, i_dts;
uint8_t *p_data;
int i_size;
int i_private_id = -1;
if( i_copy > 0 ) uint8_t header[30]; // PES header + extra < 30 (more like 17)
int i_pes_payload;
int i_pes_header;
/* HACK for private stream 1 in ps */
if( ( i_stream_id >> 8 ) == PES_PRIVATE_STREAM_1 )
{ {
memcpy( p_pes->p_buffer + bits.i_data, p_data, i_copy ); i_private_id = i_stream_id & 0xff;
i_stream_id = PES_PRIVATE_STREAM_1;
} }
i_size -= i_copy; i_pts = p_es->i_pts * 9 / 100; // 90000 units clock
p_data += i_copy; i_dts = p_es->i_dts * 9 / 100; // 90000 units clock
p_pes->i_size = bits.i_data + i_copy;
i_size = p_es->i_size;
p_data = p_es->p_buffer;
*pp_pes = p_pes = NULL;
p_es_sav = p_es;
do
{
i_pes_payload = __MIN( i_size, PES_PAYLOAD_SIZE_MAX );
i_pes_header = PESHeader( header, i_pts, i_dts, i_pes_payload, i_stream_id, i_private_id );
i_dts = -1; // only first PES has a dts
if( p_es )
{
if( sout_BufferReallocFromPreHeader( p_sout, p_es, i_pes_header ) )
{
msg_Err( p_sout, "cannot realloc prehader (should never happen)" );
return( -1 );
}
/* reuse p_es for first frame */
*pp_pes = p_pes = p_es;
/* don't touch i_dts, i_pts, i_length as are already set :) */
p_es = NULL;
}
else
{
p_pes->p_next = sout_BufferNew( p_sout, i_pes_header + i_pes_payload );
p_pes = p_pes->p_next;
p_pes->i_dts = 0;
p_pes->i_pts = 0;
p_pes->i_length = 0;
if( i_pes_payload > 0 )
{
p_sout->p_vlc->pf_memcpy( p_pes->p_buffer + i_pes_header, p_data, i_pes_payload );
}
}
/* copy header */
memcpy( p_pes->p_buffer, header, i_pes_header );
i_size -= i_pes_payload;
p_data += i_pes_payload;
p_pes->i_size = i_pes_header + i_pes_payload;
} while( i_size > 0 ); } while( i_size > 0 );
sout_BufferDelete( p_sout, p_es ); /* sav some space */
if( p_es_sav->i_size + 10*1024 < p_es_sav->i_buffer_size )
{
sout_BufferRealloc( p_sout, p_es_sav, p_es_sav->i_size );
}
return( 0 ); return( 0 );
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* mpeg4video.c * mpeg4video.c
***************************************************************************** *****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN * Copyright (C) 2001, 2002 VideoLAN
* $Id: mpeg4video.c,v 1.4 2003/01/12 04:11:35 fenrir Exp $ * $Id: mpeg4video.c,v 1.5 2003/01/17 15:26:24 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Eric Petit <titer@videolan.org> * Eric Petit <titer@videolan.org>
...@@ -391,12 +391,13 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) ...@@ -391,12 +391,13 @@ static void PacketizeThread( packetizer_thread_t *p_pack )
mtime_t i_gap; mtime_t i_gap;
i_gap = p_pes_next->i_pts - p_pes->i_pts; i_gap = p_pes_next->i_pts - p_pes->i_pts;
#if 0
if( i_gap > 1000000 / 80 ) // too big fps > 80 is no sense if( i_gap > 1000000 / 4 ) // too littl fps < 4 is no sense
{ {
i_gap = 1000000 / 25; i_gap = 1000000 / 25;
p_pack->i_pts_start = p_pack->i_pts_start =
( p_pes->i_pts - p_pack->i_pts_start ) + p_pes_next->i_pts - i_gap; - ( p_pes->i_pts - p_pack->i_pts_start ) + p_pes_next->i_pts - i_gap;
} }
else if( i_gap < 0 ) else if( i_gap < 0 )
{ {
...@@ -404,6 +405,15 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) ...@@ -404,6 +405,15 @@ static void PacketizeThread( packetizer_thread_t *p_pack )
( p_pes->i_pts - p_pack->i_pts_start ) + p_pes_next->i_pts; ( p_pes->i_pts - p_pack->i_pts_start ) + p_pes_next->i_pts;
i_gap = 0; i_gap = 0;
} }
if( i_gap < 0 )
{
msg_Dbg( p_pack->p_fifo, "pts:%lld next_pts:%lld", p_pes->i_pts, p_pes_next->i_pts );
/* work around for seek */
p_pack->i_pts_start -= i_gap;
}
// msg_Dbg( p_pack->p_fifo, "gap %lld date %lld next diff %lld", i_gap, p_pes->i_pts, p_pes_next->i_pts-p_pack->i_pts_start );
#endif
p_sout_buffer->i_length = i_gap; p_sout_buffer->i_length = i_gap;
} }
sout_InputSendBuffer( p_pack->p_sout_input, sout_InputSendBuffer( p_pack->p_sout_input,
......
...@@ -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.11 2003/01/14 04:34:13 fenrir Exp $ * $Id: stream_output.c,v 1.12 2003/01/17 15:26:24 fenrir 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>
...@@ -590,7 +590,7 @@ sout_buffer_t *sout_BufferDuplicate( sout_instance_t *p_sout, ...@@ -590,7 +590,7 @@ sout_buffer_t *sout_BufferDuplicate( sout_instance_t *p_sout,
p_dup->i_dts = p_buffer->i_dts; p_dup->i_dts = p_buffer->i_dts;
p_dup->i_pts = p_buffer->i_pts; p_dup->i_pts = p_buffer->i_pts;
p_dup->i_length = p_buffer->i_length; p_dup->i_length = p_buffer->i_length;
memcpy( p_dup->p_buffer, p_buffer->p_buffer, p_buffer->i_size ); p_sout->p_vlc->pf_memcpy( p_dup->p_buffer, p_buffer->p_buffer, p_buffer->i_size );
return( p_dup ); return( p_dup );
} }
......
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