static int GetTrackAVInf( TS_CHANNEL_PARSER *pTSChannelParser, int nIndex, char* pBuffer, int nSize ) { int pos = 0; char *p = pBuffer; TS_ELEMENT *ts_elmnt = &pTSChannelParser->ts_streams.ts_element[nIndex]; AV_ELEMENT *av_elmnt = &pTSChannelParser->av_streams.av_element[nIndex]; ES_BUFFER_ *es_buffer = &pTSChannelParser->es_buffer[nIndex]; if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "[" ); pos += AVElmntInfo( av_elmnt, p+pos, nSize-pos ); if ( es_buffer->main_track ) if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "main=yes;" ); pos += TagInfo( 1, ts_elmnt, NULL, p+pos, nSize-pos ); if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "index=%d;", nIndex ); if ( nSize > pos+2 ) { p[pos++] = ']'; p[pos++] = ';'; } //terminator return pos; }
int TracksInfo( TRACKS* pTracks, char* pBuffer, int nSize ) { int i, pos = 0, video_num=0, audio_num=0; int h_264_present=0, video_data_present=0, audio_data_present=0; char *p = pBuffer; ES_ELEMENT *pESElmnt; unsigned long bit_rate = 0; if ( IS_TS_TYPE( pTracks->track_type ) ) { if ( !(pTracks->track_attr & (ATTR_VIDEO_PRESENT|ATTR_AUDIO_PRESENT)) ) { if ( ( pTracks->track_attr & ATTR_ENCRYPTED_FLAG ) ) { pos += snprintf( pBuffer, nSize-pos, "ENCRYPTED-TS;" ); return pos; } pos += snprintf( pBuffer, nSize-pos, "NO-AV-TS;" ); return pos; } if ( pTracks->main_video_index != 0xffff ) pESElmnt = pTracks->track[pTracks->main_video_index].es_elmnt; else if ( pTracks->main_audio_index != 0xffff ) pESElmnt = pTracks->track[pTracks->main_audio_index].es_elmnt; else { pos += snprintf( p+pos, nSize-pos, "Error: no main video and audio specified." ); return 0; //no main track found; } if ( pESElmnt->es_type == ES_MPEG1 ) pos += snprintf( pBuffer, nSize-pos, "MPEG1-TS;" ); else if ( pESElmnt->es_type == ES_MPEG2 ) pos += snprintf( pBuffer, nSize-pos, "MPEG2-TS;" ); else { if ( ( pTracks->track_attr & ATTR_ENCRYPTED_FLAG ) ) pos += snprintf( pBuffer, nSize-pos, "ENCRYPTED-TS;" ); else pos += snprintf( pBuffer, nSize-pos, "UNKNOWN-TS;" ); } } else { if ( pTracks->main_video_index != 0xffff ) pESElmnt = pTracks->track[pTracks->main_video_index].es_elmnt; else if ( pTracks->main_audio_index != 0xffff ) pESElmnt = pTracks->track[pTracks->main_audio_index].es_elmnt; else { pos += snprintf( p+pos, nSize-pos, "Error: no main video and audio specified." ); return 0; //no main track found; } if ( pESElmnt->es_type == ES_MPEG1 ) pos += snprintf( p, nSize-pos, "MPEG1-PS;" ); else if ( pESElmnt->es_type == ES_MPEG2 ) pos += snprintf( p, nSize-pos, "MPEG2-PS;" ); else pos += snprintf( p, nSize-pos, "UNKNOWN-PS;" ); } for ( i = 0; i<pTracks->number_track; i++ ) { if ( pTracks->track[i].ts_elmnt && pTracks->track[i].ts_elmnt->content_type == VIDEO_DATA && pTracks->track[i].ts_packets_counter > 2 ) { video_data_present = 1; if ( pTracks->track[i].ts_elmnt->format_fourcc == SAGE_FOURCC( "H264" ) ) h_264_present=1; } if ( pTracks->track[i].ts_elmnt && pTracks->track[i].ts_elmnt->content_type == AUDIO_DATA && pTracks->track[i].ts_packets_counter > 2 ) { audio_data_present = 1; } if ( pTracks->track[i].av_elmnt->content_type == VIDEO_DATA ) { bit_rate += GetVideoRate( pTracks->track[i].av_elmnt ); video_num++; } if ( pTracks->track[i].av_elmnt->content_type == AUDIO_DATA ) { bit_rate += GetAudioRate( pTracks->track[i].av_elmnt ); audio_num++; } } if ( nSize > pos && bit_rate > 0 ) pos += snprintf( p+pos, nSize-pos, "br=%ld;", bit_rate ); if ( IS_TS_TYPE( pTracks->track_type ) ) { pos += snprintf( p+pos, nSize-pos, "%s", pTracks->track_type==MPEG_M2TS?"ps=192;":pTracks->track_type==MPEG_ASI?"ps=208;":"" ); } if ( video_num == 0 ) { if ( IS_TS_TYPE( pTracks->track_type ) ) { if ( !video_data_present && audio_num > 0) //R5000 recording live tv has enough data to parse out video AV info, pos += snprintf( p+pos, nSize-pos, "audioonly=1;" ); } else { pos += snprintf( p+pos, nSize-pos, "audioonly=1;" ); } } if ( audio_num == 0 ) { if ( IS_TS_TYPE( pTracks->track_type ) ) { if ( !audio_data_present && video_num > 0 ) //R5000 recording live tv has enough data to parse out video AV info, pos += snprintf( p+pos, nSize-pos, "videoonly=1;" ); } else { pos += snprintf( p+pos, nSize-pos, "videoonly=1;" ); } } for ( i = 0; i<pTracks->number_track ; i++ ) { if ( pTracks->track[i].av_elmnt->content_type == VIDEO_DATA ) { if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "[" ); pos += AVElmntInfo( pTracks->track[i].av_elmnt, p+pos, nSize-pos ); if ( i == pTracks->main_video_index ) if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "main=yes;" ); pos += TagInfo( pTracks->track_type, pTracks->track[i].ts_elmnt, pTracks->track[i].es_elmnt, p+pos, nSize-pos ); if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "index=%d;", pTracks->track[i].av_elmnt->stream_index ); if ( nSize > pos+2 ) { p[pos++] = ']'; p[pos++] = ';'; } //terminator } } for ( i = 0; i<pTracks->number_track ; i++ ) { if ( pTracks->track[i].av_elmnt->content_type == AUDIO_DATA ) { char tmp[16]; unsigned long language_code; unsigned char audio_type; if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "[" ); pos += AVElmntInfo( pTracks->track[i].av_elmnt, p+pos, nSize-pos ); if ( i == pTracks->main_audio_index ) if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "main=yes;" ); if ( pTracks->track[i].ts_elmnt != NULL && pTracks->track[i].ts_elmnt->language_code ) { language_code = pTracks->track[i].ts_elmnt->language_code; audio_type = pTracks->track[i].ts_elmnt->audio_type; } else { language_code = pTracks->track[i].es_elmnt->language_code; audio_type = pTracks->track[i].es_elmnt->audio_type; } if ( language_code ) { if ( language_code == LanguageCode( (unsigned char*)"qaa" ) ) strncpy( tmp, "original", sizeof(tmp) ); else Language(language_code, tmp ); if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "lang=%s;", tmp ); } if ( audio_type ) if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "ty=%s;",AudioType(audio_type) ); pos += TagInfo( pTracks->track_type, pTracks->track[i].ts_elmnt, pTracks->track[i].es_elmnt, p+pos, nSize-pos ); if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "index=%d;", pTracks->track[i].av_elmnt->stream_index ); if ( nSize > pos+3 ) { p[pos++] = ']'; p[pos++] = ';'; } //terminator } } for ( i = 0; i<pTracks->number_track ; i++ ) { if ( pTracks->track[i].av_elmnt->content_type == SUBTITLE_DATA ) { char tmp[16]; unsigned long language_code; if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "[" ); pos += AVElmntInfo( pTracks->track[i].av_elmnt, p+pos, nSize-pos ); if ( pTracks->track[i].ts_elmnt != NULL && pTracks->track[i].ts_elmnt->language_code ) language_code = pTracks->track[i].ts_elmnt->language_code; else language_code = pTracks->track[i].es_elmnt->language_code; if ( language_code ) { Language(language_code, tmp ); if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "lang=%s;", tmp ); } pos += TagInfo( pTracks->track_type, pTracks->track[i].ts_elmnt, pTracks->track[i].es_elmnt, p+pos, nSize-pos ); if ( nSize > pos ) pos += snprintf( p+pos, nSize-pos, "index=%d;", pTracks->track[i].av_elmnt->stream_index ); if ( nSize > pos+2 ) { p[pos++] = ']'; p[pos++] = ';'; } //terminator } } if ( pos < nSize ) p[pos]= 0x0; return pos; }