interact.cpp

来自「Motion JPEG编解码器源代码」· C++ 代码 · 共 249 行

CPP
249
字号
/* *  interact.cc:  Simple command-line front-end * *  Copyright (C) 2001 Andrew Stevens <andrew.stevens@philips.com> * * *  This program is free software; you can redistribute it and/or *  modify it under the terms of version 2 of the GNU General Public License *  as published by the Free Software Foundation. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */#include <config.h>#include <stdlib.h>#include <ctype.h>#include <unistd.h>#include <sys/stat.h>#include <mjpeg_logging.h>#include <format_codes.h>#include "interact.hpp"#include "videostrm.hpp"#include "audiostrm.hpp"#ifdef ZALPHA#include "zalphastrm.hpp"#endif#include "mplexconsts.hpp"#include "aunit.hpp"static const char *KindNames[] ={    "MPEG audio",    "AC3 audio",    "LPCM audio",    "DTS audio",    "MPEG video",    "Z Alpha channel"};const char *JobStream::NameOfKind(){    return KindNames[kind];}Workarounds::Workarounds() {}MultiplexJob::MultiplexJob(){    verbose = 1;    data_rate = 0;  /* 3486 = 174300B/sec would be right for VCD */    video_offset = 0;    audio_offset = 0;    sector_size = 2048;    VBR = false;    mpeg = 1;    mux_format = MPEG_FORMAT_MPEG1;    multifile_segment = false;    always_system_headers = false;    packets_per_pack = 1;    max_timeouts = 10;    max_PTS = 0;    max_segment_size = 0; // MB, default is unlimited (suitable for DVD)    outfile_pattern = 0;    packets_per_pack = 1;    audio_tracks = 0;    video_tracks = 0;    lpcm_tracks = 0;#ifdef ZALPHA    z_alpha_tracks = 0;#endif}MultiplexJob::~MultiplexJob(){	std::vector<JobStream *>::iterator i;    for( i = streams.begin(); i < streams.end(); ++i )        delete *i;}unsigned int MultiplexJob::NumberOfTracks( StreamKind kind ){    unsigned int count = 0;	std::vector<JobStream *>::iterator i;    for( i = streams.begin(); i < streams.end(); ++i )        if( (*i)->kind == kind )            ++count;    return count;    }void MultiplexJob::GetInputStreams( vector<JobStream *> &res, StreamKind kind ){    res.erase( res.begin(), res.end() );	std::vector<JobStream *>::iterator i;    for( i = streams.begin(); i < streams.end(); ++i )        if( (*i)->kind == kind )            res.push_back( *i );}void MultiplexJob::SetupInputStreams( std::vector< IBitStream *> &inputs ){    IBitStream *bs;    IBitStreamUndo undo;    unsigned int i;    bool bad_file = false;    	for( i = 0; i < inputs.size(); ++i )    {        bs = inputs[i];        // Remember the streams initial state...        bs->PrepareUndo( undo );        if( LPCMStream::Probe( *bs ) )        {            mjpeg_info ("File %s looks like an LPCM Audio stream.",                        bs->StreamName());            bs->UndoChanges( undo );            streams.push_back( new JobStream( bs,  LPCM_AUDIO) );            ++audio_tracks;            ++lpcm_tracks;            continue;        }        bs->UndoChanges( undo );        if( MPAStream::Probe( *bs ) )        {            mjpeg_info ("File %s looks like an MPEG Audio stream.",                         bs->StreamName() );            bs->UndoChanges( undo );            streams.push_back( new JobStream( bs, MPEG_AUDIO) );            ++audio_tracks;            continue;        }        bs->UndoChanges( undo );        if( AC3Stream::Probe( *bs ) )        {            mjpeg_info ("File %s looks like an AC3 Audio stream.",                        bs->StreamName());            bs->UndoChanges( undo );            streams.push_back( new JobStream( bs, AC3_AUDIO) );            ++audio_tracks;            continue;        }        bs->UndoChanges( undo );        if( DTSStream::Probe( *bs ) )        {            mjpeg_info ("File %s looks like a dts Audio stream.",                        bs->StreamName());            bs->UndoChanges( undo);            streams.push_back( new JobStream( bs, DTS_AUDIO) );            ++audio_tracks;            continue;        }        bs->UndoChanges( undo );        if( VideoStream::Probe( *bs ) )        {            mjpeg_info ("File %s looks like an MPEG Video stream.",                        bs->StreamName());            bs->UndoChanges( undo );            streams.push_back( new JobStream( bs, MPEG_VIDEO) );            ++video_tracks;            continue;        }        bs->UndoChanges( undo );#ifdef ZALPHA        if( ZAlphaStream::Probe( *bs ) )        {            mjpeg_info ("File %s looks like an Z/Alpha Video stream.",                        bs->StreamName());            bs->UndoChanges( undo );            streams.push_back( new JobStream( bs, Z_ALPHA) );            ++video_tracks;            ++z_alpha_tracks;            continue;        }#endif        bad_file = true;        mjpeg_error ("File %s unrecogniseable!", bs->StreamName());        delete bs;    }        if( bad_file )    {        mjpeg_error_exit1( "Unrecogniseable file(s)... exiting.");    }	//	// Where no parameters for streams have been specified	// simply set the default values (these will depend on the format	// we're muxing of course...)	//	for( i = video_param.size(); i < video_tracks; ++i )	{		video_param.push_back(VideoParams::Default( mux_format ));	}	for( i = lpcm_param.size(); i < lpcm_tracks; ++i )	{		lpcm_param.push_back(LpcmParams::Default(mux_format));	}	//	// Set standard values if the selected profile implies this...	//	for( i = 0; i <video_tracks; ++i )	{		if( video_param[i]->Force(mux_format) )		{			mjpeg_info( "Video stream %d: profile %d selected - ignoring non-standard options!", i, mux_format );		}	}	mjpeg_info( "Found %d audio streams and %d video streams",                audio_tracks,				video_tracks        );        }/*  * Local variables: *  c-file-style: "stroustrup" *  tab-width: 4 *  indent-tabs-mode: nil * End: */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?