Skip to content

Refactore media properties - v2 #130

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
304a28b
mediaProperty: refactore
Nov 12, 2014
bfd52eb
mediaProperties: use wrapper classes instead of structs of copies
Nov 12, 2014
b3a5e90
mediaProperty: rename file mediaProperty to util
Nov 12, 2014
2704ddb
mediaProperty: add swig interface file
Nov 12, 2014
f094292
swig: move template about mediaProperty in the corresponding interface
Nov 12, 2014
0068948
swig: add templates to mediaProperty interface
Nov 12, 2014
d59701c
file: add file util.hpp
Nov 12, 2014
08460e7
EAnalyseLevel: rename enum values
Nov 12, 2014
7157c0a
Swig: add file interface
Nov 12, 2014
9cb1b2d
InputFile: refactore analyse
Nov 17, 2014
2918b40
mediaProperty: remove default constructors of Properties
Nov 17, 2014
8df49bd
AudioProperties: get AVCodec attribute
Nov 17, 2014
129a8d1
AudioProperties: check formatContext/codecContext/codec pointers
Nov 17, 2014
104451e
AudioProperties: clean format result of getSampleFormatLongName
Nov 17, 2014
9fe1359
AudioProperties: clean getChannelDescription
Nov 17, 2014
e967cdc
VideoProperties: get AVCodec attribute
Nov 17, 2014
86b2d8a
VideoProperties: check formatContext/codecContext/codec pointers
Nov 17, 2014
2200f08
VideoProperties: use class initialiser list for Rational
Nov 17, 2014
7e16550
mediaProperty: clean output formatting of getDataMap
Nov 17, 2014
802004d
mediaProperty: fillMetadataDictionnary in constructor
Nov 17, 2014
3561f67
SWIG file interface: add EAnalyseLevel enum to binding
Nov 18, 2014
dd174c0
SWIG: clean interfaces
Nov 18, 2014
557e087
pyTests: fit to new way to get media properties
Nov 18, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/avMeta/avMeta.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include <AvTranscoder/file/InputFile.hpp>
#include <AvTranscoder/mediaProperty/printMediaProperty.hpp>
#include <AvTranscoder/mediaProperty/print.hpp>

#include <AvTranscoder/progress/NoDisplayProgress.hpp>

Expand All @@ -16,7 +16,7 @@ int main( int argc, char** argv )
avtranscoder::NoDisplayProgress p;

avtranscoder::InputFile input( argv[1] );
input.analyse( p, avtranscoder::InputFile::eAnalyseLevelFull );
input.analyse( p, avtranscoder::eAnalyseLevelFirstGop );

// a simply metadata display
std::cout << input;
Expand Down
2 changes: 1 addition & 1 deletion app/avTranscoder/avTranscoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
InputFile input( inputfilename );
input.analyse( p );

input.readStream( input.getProperties().videoStreams.at( 0 ).streamId );
input.readStream( input.getProperties().getVideoProperties().at( 0 ).getStreamId() );

// init video decoders
AvInputVideo inputVideo( input.getStream( 0 ) );
Expand Down
10 changes: 5 additions & 5 deletions app/avplay/AvReader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <AvTranscoder/essenceStream/AvInputAudio.hpp>
#include <AvTranscoder/essenceStream/AvInputVideo.hpp>
#include <AvTranscoder/transform/VideoTransform.hpp>
#include <AvTranscoder/mediaProperty/printMediaProperty.hpp>
#include <AvTranscoder/mediaProperty/print.hpp>

#include <AvTranscoder/progress/ConsoleProgress.hpp>

Expand All @@ -23,7 +23,7 @@ class AvReader : public Reader
avtranscoder::ConsoleProgress p;

_inputFile.analyse( p );
_videoStream = _inputFile.getProperties().videoStreams.at(0).streamId;
_videoStream = _inputFile.getProperties().getVideoProperties().at(0).getStreamId();

_inputFile.readStream( _videoStream );

Expand Down Expand Up @@ -58,17 +58,17 @@ class AvReader : public Reader

size_t getWidth()
{
return _inputFile.getProperties().videoStreams.at(0).width;
return _inputFile.getProperties().getVideoProperties().at(0).getWidth();
};

size_t getHeight()
{
return _inputFile.getProperties().videoStreams.at(0).height;
return _inputFile.getProperties().getVideoProperties().at(0).getHeight();
}

size_t getComponents()
{
return _inputFile.getProperties().videoStreams.at(0).componentsCount;
return _inputFile.getProperties().getVideoProperties().at(0).getComponentsCount();
}

size_t getBitDepth()
Expand Down
21 changes: 3 additions & 18 deletions src/AvTranscoder/avTranscoder.i
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
#include <AvTranscoder/codec/AudioCodec.hpp>
#include <AvTranscoder/codec/DataCodec.hpp>

#include <AvTranscoder/mediaProperty/mediaProperty.hpp>

#include <AvTranscoder/codedStream/IOutputStream.hpp>
#include <AvTranscoder/codedStream/AvOutputStream.hpp>

Expand All @@ -41,27 +39,19 @@
#include <AvTranscoder/essenceStream/AvInputAudio.hpp>
#include <AvTranscoder/essenceStream/AvInputVideo.hpp>

#include <AvTranscoder/file/InputFile.hpp>
#include <AvTranscoder/file/OutputFile.hpp>

#include <AvTranscoder/transcoder/StreamTranscoder.hpp>
#include <AvTranscoder/transcoder/Transcoder.hpp>
%}

namespace std {
namespace std {
%template(IntPair) pair< size_t, size_t >;
%template(VideoVector) vector< avtranscoder::VideoProperties >;
%template(AudioVector) vector< avtranscoder::AudioProperties >;
%template(MetadataPair) pair< string, string >;
%template(MetadatasVector) vector< pair< string, string > >;
%template(GopPair) pair< char, bool >;
%template(GopVector) vector< pair< char, bool > >;
%template(ChannelVector) vector< avtranscoder::Channel >;
%template(ProfileMap) map< string, string >;
%template(ProfilesVector) vector< map< string, string > >;
}

%include "AvTranscoder/progress/progress.i"
%include "AvTranscoder/mediaProperty/mediaProperty.i"
%include "AvTranscoder/file/file.i"

%include <AvTranscoder/ProfileLoader.hpp>

Expand All @@ -75,8 +65,6 @@ namespace std {
%include <AvTranscoder/codec/AudioCodec.hpp>
%include <AvTranscoder/codec/DataCodec.hpp>

%include <AvTranscoder/mediaProperty/mediaProperty.hpp>

%include <AvTranscoder/codedStream/IOutputStream.hpp>
%include <AvTranscoder/codedStream/AvOutputStream.hpp>

Expand All @@ -91,8 +79,5 @@ namespace std {
%include <AvTranscoder/essenceStream/AvInputAudio.hpp>
%include <AvTranscoder/essenceStream/AvInputVideo.hpp>

%include <AvTranscoder/file/InputFile.hpp>
%include <AvTranscoder/file/OutputFile.hpp>

%include <AvTranscoder/transcoder/StreamTranscoder.hpp>
%include <AvTranscoder/transcoder/Transcoder.hpp>
67 changes: 29 additions & 38 deletions src/AvTranscoder/file/InputFile.cpp
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
#include "InputFile.hpp"

#include <AvTranscoder/option/Context.hpp>
#include <AvTranscoder/mediaProperty/VideoStreamProperty.hpp>
#include <AvTranscoder/mediaProperty/AudioStreamProperty.hpp>
#include <AvTranscoder/mediaProperty/DataStreamProperty.hpp>
#include <AvTranscoder/mediaProperty/SubtitleStreamProperty.hpp>
#include <AvTranscoder/mediaProperty/AttachementStreamProperty.hpp>
#include <AvTranscoder/mediaProperty/UnknownStreamProperty.hpp>

#include <AvTranscoder/mediaProperty/util.hpp>
#include <AvTranscoder/mediaProperty/VideoProperties.hpp>
#include <AvTranscoder/mediaProperty/AudioProperties.hpp>
#include <AvTranscoder/mediaProperty/DataProperties.hpp>
#include <AvTranscoder/mediaProperty/SubtitleProperties.hpp>
#include <AvTranscoder/mediaProperty/AttachementProperties.hpp>
#include <AvTranscoder/mediaProperty/UnknownProperties.hpp>

extern "C" {
#include <libavcodec/avcodec.h>
Expand All @@ -24,7 +24,8 @@ namespace avtranscoder

InputFile::InputFile( const std::string& filename )
: _formatContext ( NULL )
, _filename ( filename )
, _properties( NULL )
, _filename( filename )
{
av_register_all();
if( avformat_open_input( &_formatContext, _filename.c_str(), NULL, NULL ) < 0 )
Expand All @@ -42,6 +43,10 @@ InputFile::InputFile( const std::string& filename )
throw std::runtime_error( "unable to find stream informations" );
}

// Initialize FileProperties
_properties = FileProperties( _formatContext );

// Create streams
for( size_t streamIndex = 0; streamIndex < _formatContext->nb_streams; ++streamIndex )
{
_inputStreams.push_back( new AvInputStream( *this, streamIndex ) );
Expand All @@ -68,56 +73,44 @@ InputFile& InputFile::analyse( IProgress& progress, const EAnalyseLevel level )

seekAtFrame( 0 );

_properties.filename = _formatContext->filename;
_properties.formatName = _formatContext->iformat->name;
_properties.formatLongName = _formatContext->iformat->long_name;
_properties.streamsCount = _formatContext->nb_streams;
_properties.programsCount = _formatContext->nb_programs;
_properties.startTime = 1.0 * (unsigned int)_formatContext->start_time / AV_TIME_BASE;
_properties.duration = 1.0 * _formatContext->duration / AV_TIME_BASE;
_properties.bitRate = _formatContext->bit_rate;
_properties.packetSize = _formatContext->packet_size;

detail::fillMetadataDictionnary( _formatContext->metadata, _properties.metadatas );

for( size_t streamId = 0; streamId < _formatContext->nb_streams; streamId++ )
{
switch( _formatContext->streams[streamId]->codec->codec_type )
{
case AVMEDIA_TYPE_VIDEO:
{
_properties.videoStreams.push_back( videoStreamInfo( _formatContext, streamId, progress, level ) );
detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.videoStreams.back().metadatas );
VideoProperties properties( _formatContext, streamId, progress, level );
_properties.getVideoProperties().push_back( properties );
break;
}
case AVMEDIA_TYPE_AUDIO:
{
_properties.audioStreams.push_back( audioStreamInfo( _formatContext, streamId ) );
detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.audioStreams.back().metadatas );
AudioProperties properties( _formatContext, streamId );
_properties.getAudioProperties().push_back( properties );
break;
}
case AVMEDIA_TYPE_DATA:
{
_properties.dataStreams.push_back( dataStreamInfo( _formatContext, streamId ) );
detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.dataStreams.back().metadatas );
DataProperties properties( _formatContext, streamId );
_properties.getDataProperties().push_back( properties );
break;
}
case AVMEDIA_TYPE_SUBTITLE:
{
_properties.subtitleStreams.push_back( subtitleStreamInfo( _formatContext, streamId ) );
detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.subtitleStreams.back().metadatas );
SubtitleProperties properties( _formatContext, streamId );
_properties.getSubtitleProperties().push_back( properties );
break;
}
case AVMEDIA_TYPE_ATTACHMENT:
{
_properties.attachementStreams.push_back( attachementStreamInfo( _formatContext, streamId ) );
detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.attachementStreams.back().metadatas );
AttachementProperties properties( _formatContext, streamId );
_properties.getAttachementProperties().push_back( properties );
break;
}
case AVMEDIA_TYPE_UNKNOWN:
{
_properties.unknownStreams.push_back( unknownStreamInfo( _formatContext, streamId ) );
detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.unknownStreams.back().metadatas );
UnknownProperties properties( _formatContext, streamId );
_properties.getUnknownPropertiesProperties().push_back( properties );
break;
}
case AVMEDIA_TYPE_NB:
Expand All @@ -132,13 +125,11 @@ InputFile& InputFile::analyse( IProgress& progress, const EAnalyseLevel level )
return *this;
}

Properties InputFile::analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level )
FileProperties InputFile::analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level )
{
InputFile file( filename );
file.analyse( progress, level );
Properties properties;
file.getProperties( properties );
return properties;
return file.getProperties();
}

AVMediaType InputFile::getStreamType( size_t index )
Expand Down Expand Up @@ -229,9 +220,9 @@ void InputFile::setProfile( const ProfileLoader::Profile& profile )
}
catch( std::exception& e )
{
std::cout << "[InputFile] warning - can't set option " << (*it).first << " to " << (*it).second << ": " << e.what() << std::endl;
std::cout << "[InputFile] warning: " << e.what() << std::endl;
}
}
}

}
}
20 changes: 8 additions & 12 deletions src/AvTranscoder/file/InputFile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@

#include <AvTranscoder/common.hpp>

#include <AvTranscoder/file/util.hpp>

#include <AvTranscoder/codec/AudioCodec.hpp>
#include <AvTranscoder/codec/VideoCodec.hpp>

#include <AvTranscoder/codedStream/AvInputStream.hpp>

#include <AvTranscoder/mediaProperty/mediaProperty.hpp>
#include <AvTranscoder/mediaProperty/FileProperties.hpp>

#include <AvTranscoder/progress/IProgress.hpp>

Expand All @@ -34,12 +36,6 @@ class AvExport InputFile

virtual ~InputFile();

enum EAnalyseLevel
{
eAnalyseLevelFast = 0,
eAnalyseLevelFull = 0,
};

/**
* @return Return the resource to access
**/
Expand All @@ -50,24 +46,24 @@ class AvExport InputFile
* call this function before getProperties().
* @param progress callback to get analysis progression
**/
InputFile& analyse( IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFull );
InputFile& analyse( IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFirstGop );

/**
* @brief Return media properties on the current InputFile.
* @note require to launch analyse() before to fill the property struture
* @return structure of media metadatas
**/
const Properties& getProperties() const { return _properties; }
const FileProperties& getProperties() const { return _properties; }

void getProperties( Properties& properties ) const { properties = _properties; }
void getProperties( FileProperties& properties ) const { properties = _properties; }

/**
* @brief Get media file properties using static method.
* @param filename input filename
* @param progress callback to get analysis progression
* @return structure of media metadatas
**/
static Properties analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFull );
static FileProperties analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFirstGop );

/**
* @brief Get stream type: video, audio, subtitle, etc.
Expand Down Expand Up @@ -125,7 +121,7 @@ class AvExport InputFile

protected:
AVFormatContext* _formatContext;
Properties _properties;
FileProperties _properties;
std::string _filename;
std::vector<AvInputStream*> _inputStreams;
};
Expand Down
2 changes: 1 addition & 1 deletion src/AvTranscoder/file/OutputFile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <AvTranscoder/common.hpp>

#include <AvTranscoder/mediaProperty/mediaProperty.hpp>
#include <AvTranscoder/mediaProperty/util.hpp>

#include <AvTranscoder/codec/VideoCodec.hpp>
#include <AvTranscoder/codec/AudioCodec.hpp>
Expand Down
9 changes: 9 additions & 0 deletions src/AvTranscoder/file/file.i
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
%{
#include <AvTranscoder/file/util.hpp>
#include <AvTranscoder/file/InputFile.hpp>
#include <AvTranscoder/file/OutputFile.hpp>
%}

%include <AvTranscoder/file/util.hpp>
%include <AvTranscoder/file/InputFile.hpp>
%include <AvTranscoder/file/OutputFile.hpp>
20 changes: 20 additions & 0 deletions src/AvTranscoder/file/util.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#ifndef _AV_TRANSCODER_FILE_UTIL_HPP_
#define _AV_TRANSCODER_FILE_UTIL_HPP_

namespace avtranscoder
{

/**
* @brief Level of file analysis.
*/
enum EAnalyseLevel
{
eAnalyseLevelHeader = 0,
eAnalyseLevelFirstGop = 1,
//eAnalyseLevelFull = 2,
};

}

#endif

28 changes: 28 additions & 0 deletions src/AvTranscoder/mediaProperty/AttachementProperties.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#include "AttachementProperties.hpp"

namespace avtranscoder
{

AttachementProperties::AttachementProperties( const AVFormatContext* formatContext, const size_t index )
: _formatContext( formatContext )
, _streamId( index )
{
if( formatContext )
detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas );
}

MetadatasMap AttachementProperties::getDataMap() const
{
MetadatasMap dataMap;

detail::add( dataMap, "streamId", _streamId );

for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex )
{
detail::add( dataMap, _metadatas.at( metadataIndex ).first, _metadatas.at( metadataIndex ).second );
}

return dataMap;
}

}
Loading