int RemuxFileW( unsigned short nTask, wchar_t* pInputFile, TUNE* pTune, int nInputFormat, wchar_t* pOutFile, int nOutputFormat, int nOption ) { REMUXER *pRemuxer; int ret, max_track_num; //if not specify a input format, detect it if ( nInputFormat == 0 ) nInputFormat = DetectFileTypeW( pInputFile ); if ( nInputFormat == 0 ) return 0; if ( nInputFormat == MPEG_M2TS ) max_track_num = MAX_TRACK_NUM *2; else max_track_num = MAX_TRACK_NUM; pRemuxer = CreateRemuxer( nInputFormat, max_track_num, ES_BUFFER_SIZE ); pRemuxer->task = nTask; SetupMessageDumper( pRemuxer->demuxer, (DUMP)RemuxMessageDumper, pRemuxer ); ret = OpenFileSourceW( pRemuxer->demuxer, pInputFile, nInputFormat, pTune ); if ( !ret ) { ReleaseRemuxer( pRemuxer ); return 0; } if ( nOption & 0x01 ) DisabeTSPtsFix( pRemuxer ); if ( nOption & 0x02 ) SetupEPGDump( pRemuxer, (DUMP)EPGDumper, pRemuxer ); SetupEPGDumpLanguage( pRemuxer, LanguageCode((unsigned char*)"eng") ); if ( pOutFile != NULL && pOutFile[0] != 0x0 ) CreateFileOutputW( pRemuxer, pOutFile, nOutputFormat, max_track_num ); if ( IS_TS_TYPE(nOutputFormat) ) SetupBlockDataDumper( pRemuxer->demuxer, BlockBufferTSDump, pRemuxer->ts_builder ); else if ( IS_PS_TYPE(nOutputFormat) ) SetupBlockDataDumper( pRemuxer->demuxer, BlockBufferPSDump, pRemuxer->ps_builder ); pRemuxer->state = 1; //looping pump data from file into remuxer PumpFileData( pRemuxer->demuxer, 0, RemuxFileProgressCallback, pRemuxer ); PostStatusMessage( pRemuxer, "STREAM END (slot:0)" ); ReleaseFileOutput( pRemuxer ); CloseFileSource( pRemuxer->demuxer ); ReleaseRemuxer( pRemuxer ); return 1; }
int CreateFileOutputW( REMUXER *pRemuxer, wchar_t* pFileName, int nOutputFormat, int nMaxTrackNum) { //pRemuxer->output_file = fopen( pFileName, "wb" ); #ifdef WIN32 //pRemuxer->output_file = FOPEN( pFileName, _O_WRONLY|_O_BINARY|_O_CREAT, _SH_DENYNO , _S_IREAD|_S_IWRITE ); pRemuxer->output_file = _wsopen( (wchar_t*)pFileName, _O_RDONLY|_O_BINARY, _SH_DENYNO , _S_IREAD|_S_IWRITE ); #else pRemuxer->output_file = open( (char*)pFileName, O_WRONLY|O_CREAT, 0666 ); #endif if ( pRemuxer->output_file ) { SageLog(( _LOG_TRACE, 3, TEXT("Output file %s"), pFileName )); } else return 0; pRemuxer->output_track[0] = CreateTracks(nMaxTrackNum); pRemuxer->output_track[0]->track_type = nOutputFormat; if ( IS_PS_TYPE( nOutputFormat ) ) { int build_header_in_buffer; //if es block has space to build a PACK+PES build_header_in_buffer = SourceIsTSType( pRemuxer->demuxer ); pRemuxer->ps_builder = CreatePSBuilder( pRemuxer->output_track[0], ES_PACKET_SIZE, build_header_in_buffer ); pRemuxer->ps_builder->dumper.stream_dumper = (DUMP)PSOutputDataFileDumper; pRemuxer->ps_builder->dumper.stream_dumper_context = pRemuxer; } else if ( IS_TS_TYPE(nOutputFormat) ) { pRemuxer->ts_builder = CreateTSBuilder( pRemuxer->output_track[0], nOutputFormat ); pRemuxer->ts_builder->dumper.stream_dumper = (DUMP)TSOutputDataFileDumper; pRemuxer->ts_builder->dumper.stream_dumper_context = pRemuxer; } return 1; }
void CTSParserFilter::OutpinConnecting( IPin * pReceivePin, CBasePin* pFilterPin, const AM_MEDIA_TYPE *pmt ) { REMUXER* pRemuxer; HRESULT hr = m_pInputPin->GetParser( &pRemuxer ); if ( hr != NOERROR ) return ; if ( pFilterPin == m_pOutputPin ) { CMediaType mt; mt.SetTemporalCompression(FALSE); mt.SetType(&MEDIATYPE_Stream); mt.SetSubtype(&MEDIASUBTYPE_MPEG2_TRANSPORT); if ( IS_PS_TYPE( m_wOutputFormat ) ) mt.SetSubtype(&MEDIASUBTYPE_MPEG2_PROGRAM ); else mt.SetSubtype(&MEDIASUBTYPE_MPEG2_TRANSPORT); m_pOutputPin->DefaultMediaType( &mt ); } }
int CreateStreamOutput( REMUXER *pRemuxer, int nOutputFormat, DUMP pfnOutputDump, void* pOutputDumpContext ) { pRemuxer->output_track[0] = CreateTracks(MAX_TRACK_NUM); pRemuxer->output_track[0]->track_type = nOutputFormat; if ( IS_PS_TYPE( nOutputFormat ) ) { int build_header_in_buffer; //if es block has space to build a PACK+PES build_header_in_buffer = SourceIsTSType( pRemuxer->demuxer ); pRemuxer->ps_builder = CreatePSBuilder( pRemuxer->output_track[0], ES_PACKET_SIZE, build_header_in_buffer ); pRemuxer->ps_builder->dumper.stream_dumper = pfnOutputDump; pRemuxer->ps_builder->dumper.stream_dumper_context = pOutputDumpContext; SetupBlockDataDumper( pRemuxer->demuxer, BlockBufferPSDump, pRemuxer->ps_builder ); } else if ( IS_TS_TYPE(nOutputFormat) ) { pRemuxer->ts_builder = CreateTSBuilder( pRemuxer->output_track[0], nOutputFormat ); pRemuxer->ts_builder->dumper.stream_dumper = pfnOutputDump; pRemuxer->ts_builder->dumper.stream_dumper_context = pOutputDumpContext; SetupBlockDataDumper( pRemuxer->demuxer, BlockBufferTSDump, pRemuxer->ts_builder ); } pRemuxer->output_format = nOutputFormat; return 1; }
void CheckTracksAttr( TRACKS* pTracks, unsigned long LanguageCode ) { int i; if ( IS_TS_TYPE( pTracks->track_type ) ) { int video_track_num = 0, audio_track_num = 0; int video_scrambling_track_num = 0, audio_scrambling_track_num = 0; //count totoal track for ( i = 0; i<pTracks->total_track; i++ ) { if ( pTracks->track[i].ts_elmnt == NULL ) break; } pTracks->number_track = i; if ( pTracks->main_video_index == 0xffff ) { //select main video and check tracks attribute for ( i = 0; i<pTracks->number_track; i++ ) { if ( pTracks->track[i].ts_elmnt->content_type == VIDEO_DATA ) { if ( pTracks->main_video_index == 0xffff ) pTracks->main_video_index = i; else { if ( pTracks->track[i].ts_packets_counter > pTracks->track[ pTracks->main_video_index ].ts_packets_counter ) pTracks->main_video_index = i; } if ( pTracks->track[i].scrambling_flag ) video_scrambling_track_num++; video_track_num++; if ( pTracks->track[i].es_elmnt->format_fourcc != 0 ) pTracks->track_attr |= ATTR_VIDEO_PRESENT; } } } if ( pTracks->main_audio_index == 0xffff ) { int weights[64]={0}; //select main audio and check tracks attribute for ( i = 0; i<pTracks->number_track && i<64; i++ ) { //skip no data stream; if ( pTracks->track[i].av_elmnt->content_type == 0 ) continue; if ( pTracks->track[i].ts_elmnt->content_type == AUDIO_DATA && pTracks->track[i].ts_packets_counter > 0 ) { weights[i] = 0; if ( LanguageCode ) weights[i] = pTracks->track[i].ts_elmnt->language_code == LanguageCode ? 10000 : pTracks->track[i].ts_elmnt->language_code == 0 ? 10000 : 0; weights[i] += pTracks->track[i].ts_elmnt->audio_type == 0 ? 9000 : /* normal */ pTracks->track[i].ts_elmnt->audio_type == 3 ? 8000 : /* silent */ pTracks->track[i].ts_elmnt->audio_type == 2 ? 7000 : /* impaired */ pTracks->track[i].ts_elmnt->audio_type == 1 ? 6000 : 0; /* commentary */ weights[i] += GetAudioSoundChannelNum( pTracks->track[i].av_elmnt ) * 100; weights[i] += GetAudioSoundBitRate( pTracks->track[i].av_elmnt ) / 10000; /* range 1-100 */ //skip LPCM because parser isn't ready if ( pTracks->track[i].ts_elmnt->format_fourcc == SAGE_FOURCC( "LPCM" ) ) weights[i] = -20000; if ( pTracks->main_audio_index == 0xffff ) pTracks->main_audio_index = i; else { if ( weights[i] > weights[ pTracks->main_audio_index ] ) { pTracks->main_audio_index = i; } else if ( weights[i] == weights[ pTracks->main_audio_index ] ) { if ( pTracks->track[i].ts_packets_counter> pTracks->track[ pTracks->main_audio_index ].ts_packets_counter+3 ) pTracks->main_audio_index = i; } } if ( pTracks->track[i].scrambling_flag ) audio_scrambling_track_num++; audio_track_num++; if ( pTracks->track[i].es_elmnt->format_fourcc != 0 ) pTracks->track_attr |= ATTR_AUDIO_PRESENT; } } } if ( video_track_num && !(pTracks->track_attr & ATTR_VIDEO_PRESENT) && video_scrambling_track_num ) pTracks->track_attr |= ATTR_ENCRYPTED_FLAG ; if ( audio_track_num && !(pTracks->track_attr & ATTR_AUDIO_PRESENT) && audio_scrambling_track_num == audio_track_num ) pTracks->track_attr |= ATTR_ENCRYPTED_FLAG ; //return ( pTracks->main_video_index != 0xffff || pTracks->main_audio_index != 0xffff ); } else if ( IS_PS_TYPE ( pTracks->track_type ) ) { if ( pTracks->main_video_index == 0xffff ) { //select main video for ( i = 0; i<pTracks->number_track; i++ ) { if ( pTracks->track[i].av_elmnt->content_type == VIDEO_DATA ) { if ( pTracks->main_video_index == 0xffff ) pTracks->main_video_index = i; else { if ( pTracks->track[i].es_blocks_counter > pTracks->track[ pTracks->main_video_index ].es_blocks_counter ) pTracks->main_video_index = i; } } } } if ( pTracks->main_audio_index == 0xffff ) { //select main audio int weights[64]={0}; for ( i = 0; i<pTracks->number_track && i <64; i++ ) { if ( pTracks->track[i].av_elmnt->content_type == AUDIO_DATA ) { weights[i] = 0; if ( LanguageCode ) weights[i] = pTracks->track[i].es_elmnt->language_code == LanguageCode ? 10000 : pTracks->track[i].es_elmnt->language_code == 0 ? 10000 : 0; weights[i] += pTracks->track[i].es_elmnt->audio_type == 0 ? 9000 : /* normal */ pTracks->track[i].es_elmnt->audio_type == 3 ? 8000 : /* silent */ pTracks->track[i].es_elmnt->audio_type == 2 ? 7000 : /* impaired */ pTracks->track[i].es_elmnt->audio_type == 1 ? 6000 : 0; /* commentary */ weights[i] += GetAudioSoundChannelNum( pTracks->track[i].av_elmnt ) * 100; weights[i] += GetAudioSoundBitRate( pTracks->track[i].av_elmnt ) / 10000; /* range 1-100 */ //skip LPCM because parser isn't ready if ( pTracks->track[i].es_elmnt->format_fourcc == SAGE_FOURCC( "LPCM" ) ) { weights[i] = -20000; } if ( pTracks->main_audio_index == 0xffff ) pTracks->main_audio_index = i; else { if ( weights[i] > weights[ pTracks->main_audio_index ] ) { pTracks->main_audio_index = i; } else if ( weights[i] == weights[ pTracks->main_audio_index ] ) { if ( pTracks->track[i].es_blocks_counter > pTracks->track[ pTracks->main_audio_index ].es_blocks_counter ) pTracks->main_audio_index = i; } } } } } //check video audio present for ( i = 0; i<pTracks->number_track && i <64; i++ ) { if ( pTracks->track[i].es_elmnt->format_fourcc != 0 ) { if ( pTracks->track[i].av_elmnt->content_type == AUDIO_DATA ) pTracks->track_attr |= ATTR_AUDIO_PRESENT; else if ( pTracks->track[i].av_elmnt->content_type == VIDEO_DATA ) pTracks->track_attr |= ATTR_VIDEO_PRESENT; } } //return ( pTracks->main_video_index != 0xffff || pTracks->main_audio_index != 0xffff ); } return ; }