@ -374,20 +374,55 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
case AVMEDIA_TYPE_SUBTITLE :
{
const char default_language [ ] = " und " ;
const char * language = lang & & strlen ( lang - > value ) = = 3 ? lang - > value : default_language ;
* q + + = 0x59 ;
* q + + = 8 ;
* q + + = language [ 0 ] ;
* q + + = language [ 1 ] ;
* q + + = language [ 2 ] ;
* q + + = 0x10 ; /* normal subtitles (0x20 = if hearing pb) */
if ( st - > codec - > extradata_size = = 4 ) {
memcpy ( q , st - > codec - > extradata , 4 ) ;
q + = 4 ;
} else {
put16 ( & q , 1 ) ; /* page id */
put16 ( & q , 1 ) ; /* ancillary page id */
}
const char * language = lang & & strlen ( lang - > value ) > = 3 ? lang - > value : default_language ;
if ( st - > codec - > codec_id = = AV_CODEC_ID_DVB_SUBTITLE ) {
/* The descriptor tag. subtitling_descriptor */
* q + + = 0x59 ;
* q + + = 8 ;
* q + + = language [ 0 ] ;
* q + + = language [ 1 ] ;
* q + + = language [ 2 ] ;
* q + + = 0x10 ; /* normal subtitles (0x20 = if hearing pb) */
if ( st - > codec - > extradata_size = = 4 ) {
memcpy ( q , st - > codec - > extradata , 4 ) ;
q + = 4 ;
} else {
put16 ( & q , 1 ) ; /* page id */
put16 ( & q , 1 ) ; /* ancillary page id */
}
} else if ( st - > codec - > codec_id = = AV_CODEC_ID_DVB_TELETEXT ) {
uint8_t * len_ptr = NULL ;
int extradata_copied = 0 ;
/* The descriptor tag. teletext_descriptor */
* q + + = 0x56 ;
len_ptr = q + + ;
while ( strlen ( language ) > = 3 ) {
* q + + = * language + + ;
* q + + = * language + + ;
* q + + = * language + + ;
/* Skip comma */
if ( * language ! = ' \0 ' )
language + + ;
if ( st - > codec - > extradata_size - 1 > extradata_copied ) {
memcpy ( q , st - > codec - > extradata + extradata_copied , 2 ) ;
extradata_copied + = 2 ;
q + = 2 ;
} else {
/* The Teletext descriptor:
* teletext_type : This 5 - bit field indicates the type of Teletext page indicated . ( 0x01 Initial Teletext page )
* teletext_magazine_number : This is a 3 - bit field which identifies the magazine number .
* teletext_page_number : This is an 8 - bit field giving two 4 - bit hex digits identifying the page number . */
* q + + = 0x08 ;
* q + + = 0x00 ;
}
}
* len_ptr = q - len_ptr - 1 ;
}
}
break ;
case AVMEDIA_TYPE_VIDEO :
@ -859,7 +894,7 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
MpegTSWrite * ts = s - > priv_data ;
uint8_t buf [ TS_PACKET_SIZE ] ;
uint8_t * q ;
int val , is_start , len , header_len , write_pcr , is_dvb_subtitle , flags ;
int val , is_start , len , header_len , write_pcr , is_dvb_subtitle , is_dvb_teletext , flags ;
int afc_len , stuffing_len ;
int64_t pcr = - 1 ; /* avoid warning */
int64_t delay = av_rescale ( s - > max_delay , 90000 , AV_TIME_BASE ) ;
@ -923,11 +958,13 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
}
if ( is_start ) {
int pes_extension = 0 ;
int pes_header_stuffing_bytes = 0 ;
/* write PES header */
* q + + = 0x00 ;
* q + + = 0x00 ;
* q + + = 0x01 ;
is_dvb_subtitle = 0 ;
is_dvb_teletext = 0 ;
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO ) {
if ( st - > codec - > codec_id = = AV_CODEC_ID_DIRAC ) {
* q + + = 0xfd ;
@ -944,9 +981,12 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
* q + + = 0xfd ;
} else {
* q + + = 0xbd ;
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_SUBTITLE & &
st - > codec - > codec_id = = AV_CODEC_ID_DVB_SUBTITLE ) {
is_dvb_subtitle = 1 ;
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_SUBTITLE ) {
if ( st - > codec - > codec_id = = AV_CODEC_ID_DVB_SUBTITLE ) {
is_dvb_subtitle = 1 ;
} else if ( st - > codec - > codec_id = = AV_CODEC_ID_DVB_TELETEXT ) {
is_dvb_teletext = 1 ;
}
}
}
header_len = 0 ;
@ -983,6 +1023,10 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
flags | = 0x01 ;
header_len + = 3 ;
}
if ( is_dvb_teletext ) {
pes_header_stuffing_bytes = 0x24 - header_len ;
header_len = 0x24 ;
}
len = payload_size + header_len + 3 ;
/* 3 extra bytes should be added to DVB subtitle payload: 0x20 0x00 at the beginning and trailing 0xff */
if ( is_dvb_subtitle ) {
@ -1036,6 +1080,10 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
* q + + = 0x20 ;
* q + + = 0x00 ;
}
if ( is_dvb_teletext ) {
memset ( q , 0xff , pes_header_stuffing_bytes ) ;
q + = pes_header_stuffing_bytes ;
}
is_start = 0 ;
}
/* header size */