blob: a7cd1d4e803449df3965a6fbda9ea650c570592a [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
//
// The contents of this file are subject to the Mozilla Public License
// Version 1.1 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://www.mozilla.org/MPL/
//
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is MP4v2.
//
// The Initial Developer of the Original Code is Kona Blend.
// Portions created by Kona Blend are Copyright (C) 2008.
// All Rights Reserved.
//
// Contributors:
// Kona Blend, kona8lend@@gmail.com
// Edward Groenendaal, egroenen@@cisco.com
//
///////////////////////////////////////////////////////////////////////////////
#include "util/impl.h"
namespace mp4v2 { namespace util {
///////////////////////////////////////////////////////////////////////////////
class SubtitleUtility : public Utility
{
private:
enum SubtitleLongCode {
LC_LIST = _LC_MAX,
LC_EXPORT,
LC_IMPORT,
LC_REMOVE,
};
public:
SubtitleUtility( int, char** );
protected:
// delegates implementation
bool utility_option( int, bool& );
bool utility_job( JobContext& );
private:
bool actionList ( JobContext& );
bool actionExport ( JobContext& );
bool actionImport ( JobContext& );
bool actionRemove ( JobContext& );
private:
Group _actionGroup;
bool (SubtitleUtility::*_action)( JobContext& );
std::string _stTextFile;
};
///////////////////////////////////////////////////////////////////////////////
SubtitleUtility::SubtitleUtility( int argc, char** argv )
: Utility ( "mp4subtitle", argc, argv )
, _actionGroup ( "ACTIONS" )
, _action ( NULL )
{
// add standard options which make sense for this utility
_group.add( STD_OPTIMIZE );
_group.add( STD_DRYRUN );
_group.add( STD_KEEPGOING );
_group.add( STD_OVERWRITE );
_group.add( STD_FORCE );
_group.add( STD_QUIET );
_group.add( STD_DEBUG );
_group.add( STD_VERBOSE );
_group.add( STD_HELP );
_group.add( STD_VERSION );
_group.add( STD_VERSIONX );
_actionGroup.add( "list", false, LC_LIST, "list available subtitles" );
_actionGroup.add( "export", true, LC_EXPORT, "export subtitles to TXT", "TXT" );
_actionGroup.add( "import", true, LC_IMPORT, "import subtitles from TXT", "TXT" );
_actionGroup.add( "remove", false, LC_REMOVE, "remove all subtitles" );
_groups.push_back( &_actionGroup );
_usage = "[OPTION]... ACTION file...";
_description =
// 79-cols, inclusive, max desired width
// |----------------------------------------------------------------------------|
"\nFor each mp4 file specified, perform the specified ACTION. An action must be"
"\nspecified. Some options are not applicable to some actions.";
}
///////////////////////////////////////////////////////////////////////////////
bool
SubtitleUtility::actionExport( JobContext& job )
{
job.fileHandle = MP4Read( job.file.c_str() );
if( job.fileHandle == MP4_INVALID_FILE_HANDLE )
return herrf( "unable to open for read: %s\n", job.file.c_str() );
verbose1f( "NOT IMPLEMENTED\n" );
return FAILURE;
}
///////////////////////////////////////////////////////////////////////////////
bool
SubtitleUtility::actionImport( JobContext& job )
{
job.fileHandle = MP4Modify( job.file.c_str() );
if( job.fileHandle == MP4_INVALID_FILE_HANDLE )
return herrf( "unable to open for write: %s\n", job.file.c_str() );
verbose1f( "NOT IMPLEMENTED\n" );
return FAILURE;
}
///////////////////////////////////////////////////////////////////////////////
bool
SubtitleUtility::actionList( JobContext& job )
{
job.fileHandle = MP4Read( job.file.c_str() );
if( job.fileHandle == MP4_INVALID_FILE_HANDLE )
return herrf( "unable to open for read: %s\n", job.file.c_str() );
verbose1f( "NOT IMPLEMENTED\n" );
return FAILURE;
}
///////////////////////////////////////////////////////////////////////////////
bool
SubtitleUtility::actionRemove( JobContext& job )
{
job.fileHandle = MP4Modify( job.file.c_str() );
if( job.fileHandle == MP4_INVALID_FILE_HANDLE )
return herrf( "unable to open for write: %s\n", job.file.c_str() );
verbose1f( "NOT IMPLEMENTED" );
return FAILURE;
}
///////////////////////////////////////////////////////////////////////////////
bool
SubtitleUtility::utility_job( JobContext& job )
{
if( !_action )
return herrf( "no action specified\n" );
return (this->*_action)( job );
}
///////////////////////////////////////////////////////////////////////////////
bool
SubtitleUtility::utility_option( int code, bool& handled )
{
handled = true;
switch( code ) {
case LC_LIST:
_action = &SubtitleUtility::actionList;
break;
case LC_EXPORT:
_action = &SubtitleUtility::actionExport;
_stTextFile = prog::optarg;
if( _stTextFile.empty() )
return herrf( "invalid TXT file: empty-string\n" );
break;
case LC_IMPORT:
_action = &SubtitleUtility::actionImport;
_stTextFile = prog::optarg;
if( _stTextFile.empty() )
return herrf( "invalid TXT file: empty-string\n" );
break;
case LC_REMOVE:
_action = &SubtitleUtility::actionRemove;
break;
default:
handled = false;
break;
}
return SUCCESS;
}
///////////////////////////////////////////////////////////////////////////////
}} // namespace mp4v2::util
///////////////////////////////////////////////////////////////////////////////
extern "C"
int main( int argc, char** argv )
{
mp4v2::util::SubtitleUtility util( argc, argv );
return util.process();
}