Commit 85b124f0 authored by Laurent Aimar's avatar Laurent Aimar

Added cc data extraction support for mpeg 1/2 when the mpeg packetizer

is used. (Only dvb/atsc CC support is working)
parent f75f9b5b
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include <vlc_block.h> #include <vlc_block.h>
#include <vlc_codec.h> #include <vlc_codec.h>
#include <vlc_block_helper.h> #include <vlc_block_helper.h>
#include "../codec/cc.h"
#define SYNC_INTRAFRAME_TEXT N_("Sync on Intra Frame") #define SYNC_INTRAFRAME_TEXT N_("Sync on Intra Frame")
#define SYNC_INTRAFRAME_LONGTEXT N_("Normally the packetizer would " \ #define SYNC_INTRAFRAME_LONGTEXT N_("Normally the packetizer would " \
...@@ -74,6 +75,7 @@ vlc_module_end(); ...@@ -74,6 +75,7 @@ vlc_module_end();
*****************************************************************************/ *****************************************************************************/
static block_t *Packetize( decoder_t *, block_t ** ); static block_t *Packetize( decoder_t *, block_t ** );
static block_t *ParseMPEGBlock( decoder_t *, block_t * ); static block_t *ParseMPEGBlock( decoder_t *, block_t * );
static block_t *GetCc( decoder_t *p_dec, vlc_bool_t pb_present[4] );
struct decoder_sys_t struct decoder_sys_t
{ {
...@@ -123,6 +125,12 @@ struct decoder_sys_t ...@@ -123,6 +125,12 @@ struct decoder_sys_t
/* Sync behaviour */ /* Sync behaviour */
vlc_bool_t b_sync_on_intra_frame; vlc_bool_t b_sync_on_intra_frame;
vlc_bool_t b_discontinuity; vlc_bool_t b_discontinuity;
/* */
vlc_bool_t b_cc_reset;
uint32_t i_cc_flags;
mtime_t i_cc_pts;
cc_data_t cc;
}; };
enum { enum {
...@@ -147,6 +155,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -147,6 +155,7 @@ static int Open( vlc_object_t *p_this )
es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_FOURCC('m','p','g','v') ); es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_FOURCC('m','p','g','v') );
p_dec->pf_packetize = Packetize; p_dec->pf_packetize = Packetize;
p_dec->pf_get_cc = GetCc;
p_dec->p_sys = p_sys = malloc( sizeof( decoder_sys_t ) ); p_dec->p_sys = p_sys = malloc( sizeof( decoder_sys_t ) );
...@@ -189,6 +198,11 @@ static int Open( vlc_object_t *p_this ) ...@@ -189,6 +198,11 @@ static int Open( vlc_object_t *p_this )
if( p_sys->b_sync_on_intra_frame ) if( p_sys->b_sync_on_intra_frame )
msg_Dbg( p_dec, "syncing on intra frame now" ); msg_Dbg( p_dec, "syncing on intra frame now" );
p_sys->b_cc_reset = VLC_FALSE;
p_sys->i_cc_pts = 0;
p_sys->i_cc_flags = 0;
cc_Init( &p_sys->cc );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -367,6 +381,33 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block ) ...@@ -367,6 +381,33 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
} }
} }
/*****************************************************************************
* GetCc:
*****************************************************************************/
static block_t *GetCc( decoder_t *p_dec, vlc_bool_t pb_present[4] )
{
decoder_sys_t *p_sys = p_dec->p_sys;
block_t *p_cc;
int i;
for( i = 0; i < 4; i++ )
pb_present[i] = p_sys->cc.pb_present[i];
if( p_sys->cc.i_data <= 0 )
return NULL;
p_cc = block_New( p_dec, p_sys->cc.i_data);
if( p_cc )
{
memcpy( p_cc->p_buffer, p_sys->cc.p_data, p_sys->cc.i_data );
p_cc->i_dts =
p_cc->i_pts = p_sys->i_cc_pts;
p_cc->i_flags = p_sys->i_cc_flags & ( BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B);
}
cc_Flush( &p_sys->cc );
return p_cc;
}
/***************************************************************************** /*****************************************************************************
* ParseMPEGBlock: Re-assemble fragments into a block containing a picture * ParseMPEGBlock: Re-assemble fragments into a block containing a picture
*****************************************************************************/ *****************************************************************************/
...@@ -498,6 +539,17 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag ) ...@@ -498,6 +539,17 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
{ {
p_sys->b_second_field = 0; p_sys->b_second_field = 0;
} }
/* CC */
p_sys->b_cc_reset = VLC_TRUE;
p_sys->i_cc_pts = p_pic->i_pts;
p_sys->i_cc_flags = p_pic->i_flags;
}
if( !p_pic && p_sys->b_cc_reset )
{
p_sys->b_cc_reset = VLC_FALSE;
cc_Flush( &p_sys->cc );
} }
/* /*
...@@ -618,6 +670,10 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag ) ...@@ -618,6 +670,10 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
p_sys->i_progressive_frame = p_frag->p_buffer[8] >> 7; p_sys->i_progressive_frame = p_frag->p_buffer[8] >> 7;
} }
} }
else if( p_frag->p_buffer[3] == 0xb2 && p_frag->i_buffer > 4 )
{
cc_Extract( &p_sys->cc, &p_frag->p_buffer[4], p_frag->i_buffer - 4 );
}
else if( p_frag->p_buffer[3] == 0x00 ) else if( p_frag->p_buffer[3] == 0x00 )
{ {
/* Picture start code */ /* Picture start code */
......
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