Skip to content

Commit 0c766a8

Browse files
author
Clement Champetier
committed
Add OptionLoader: manage a list of Option
* Update optionsChecker to use the OptionLoader. The app calls the loader and displays the list of options.
1 parent 6c91f89 commit 0c766a8

File tree

3 files changed

+205
-152
lines changed

3 files changed

+205
-152
lines changed

app/optionChecker/optionChecker.cpp

Lines changed: 4 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
#include <AvTranscoder/InputFile.hpp>
22
#include <AvTranscoder/DatasStructures/AudioDesc.hpp>
33

4-
#include <AvTranscoder/Options/OptionInt.hpp>
5-
#include <AvTranscoder/Options/OptionDouble.hpp>
6-
#include <AvTranscoder/Options/OptionString.hpp>
7-
#include <AvTranscoder/Options/OptionBoolean.hpp>
8-
#include <AvTranscoder/Options/OpionRatio.hpp>
94
#include <AvTranscoder/Options/OptionGroup.hpp>
105
#include <AvTranscoder/Options/OptionChoice.hpp>
11-
#include <AvTranscoder/Option.hpp>
6+
#include <AvTranscoder/OptionLoader.hpp>
127

13-
#include <vector>
148
#include <string>
159
#include <iostream>
1610
#include <iomanip>
@@ -23,153 +17,11 @@ int optionChecker( const std::string& inputfilename )
2317

2418
avtranscoder::AudioDesc audioDesc( inputFile.getStream( 0 ).getAudioDesc() );
2519

26-
std::vector<avtranscoder::Option*> options;
27-
std::vector<avtranscoder::OptionChoice*> optionsChoice; // need to access easely to the OptionChoice to add the list of value for each of them
28-
std::vector<avtranscoder::OptionGroup*> optionsGroup; // need to access easely to the OptionGroup to add the list of value for each of them
29-
try
30-
{
31-
const AVOption* avOption = NULL;
32-
33-
while( ( avOption = av_opt_next( audioDesc.getCodecContext(), avOption ) ) != NULL )
34-
{
35-
if( !avOption || ! avOption->name )
36-
{
37-
continue;
38-
}
39-
40-
avtranscoder::Option* opt = NULL;
41-
42-
std::cout << "The option is " << avOption->name << " of type : " << avOption->type << std::endl;
43-
44-
if( avOption->unit && avOption->type == AV_OPT_TYPE_FLAGS )
45-
{
46-
opt = new avtranscoder::OptionGroup( *avOption );
47-
options.push_back( opt );
48-
optionsGroup.push_back( dynamic_cast<avtranscoder::OptionGroup*>( opt ) );
49-
continue;
50-
}
51-
if( avOption->unit && avOption->type == AV_OPT_TYPE_INT )
52-
{
53-
opt = new avtranscoder::OptionChoice( *avOption );
54-
options.push_back( opt );
55-
optionsChoice.push_back( dynamic_cast<avtranscoder::OptionChoice*>( opt ) );
56-
continue;
57-
}
58-
59-
switch( avOption->type )
60-
{
61-
case AV_OPT_TYPE_FLAGS:
62-
{
63-
opt = new avtranscoder::OptionBoolean( *avOption );
64-
break;
65-
}
66-
case AV_OPT_TYPE_INT:
67-
case AV_OPT_TYPE_INT64:
68-
{
69-
opt = new avtranscoder::OptionInt( *avOption );
70-
break;
71-
}
72-
case AV_OPT_TYPE_DOUBLE:
73-
case AV_OPT_TYPE_FLOAT:
74-
{
75-
opt = new avtranscoder::OptionDouble( *avOption );
76-
break;
77-
}
78-
case AV_OPT_TYPE_STRING:
79-
{
80-
opt = new avtranscoder::OptionString( *avOption );
81-
break;
82-
}
83-
case AV_OPT_TYPE_RATIONAL:
84-
{
85-
opt = new avtranscoder::OpionRatio( *avOption );
86-
break;
87-
}
88-
case AV_OPT_TYPE_BINARY:
89-
{
90-
opt = new avtranscoder::OptionString( *avOption );
91-
break;
92-
}
93-
case AV_OPT_TYPE_CONST:
94-
{
95-
break;
96-
}
97-
default:
98-
{
99-
std::cout << "----- Unknowed type for " << avOption->name << "-----" << std::endl;
100-
break;
101-
}
102-
}
103-
if( opt )
104-
options.push_back( opt );
105-
}
106-
107-
// adding enum values and set default value for enums
108-
avOption = NULL;
109-
while( (avOption = av_opt_next( audioDesc.getCodecContext(), avOption) ) != NULL )
110-
{
111-
if( !avOption ||
112-
!avOption->name ||
113-
( avOption->unit && avOption->type == AV_OPT_TYPE_FLAGS ) ||
114-
( avOption->unit && avOption->type == AV_OPT_TYPE_INT ) )
115-
{
116-
continue;
117-
}
118-
119-
avtranscoder::OptionBoolean* optBoolean = NULL;
120-
121-
switch( avOption->type )
122-
{
123-
case AV_OPT_TYPE_CONST:
124-
{
125-
for( size_t i = 0; i < optionsChoice.size(); i++ )
126-
{
127-
if( avOption->unit == optionsChoice.at( i )->getUnit() )
128-
{
129-
if( avOption->help )
130-
optionsChoice.at( i )->appendChoice( avOption->name, avOption->help );
131-
else
132-
optionsChoice.at( i )->appendChoice( avOption->name );
133-
134-
double valueDouble;
135-
if( avOption->default_val.dbl == optionsChoice.at( i )->getDefaultValue( valueDouble ) )
136-
optionsChoice.at( i )->setDefaultChoiceIndex( optionsChoice.at( i )->getNbChoices() - 1 );
137-
}
138-
}
139-
140-
for( size_t i = 0; i < optionsGroup.size(); i++ )
141-
{
142-
std::string name = "g_";
143-
name += avOption->unit;
144-
if( name == optionsGroup.at( i )->getName() )
145-
{
146-
optBoolean = new avtranscoder::OptionBoolean( *avOption );
147-
optionsGroup.at( i )->appendElement( *optBoolean );
148-
break;
149-
}
150-
}
151-
}
152-
default:
153-
{
154-
break;
155-
}
156-
}
157-
}
158-
}
159-
160-
catch( std::exception &e )
161-
{
162-
for( auto it = options.begin(); it != options.end(); ++it)
163-
{
164-
delete *it;
165-
}
166-
options.clear();
167-
168-
throw e;
169-
}
20+
avtranscoder::OptionLoader optionLoader;
21+
optionLoader.loadOptions( audioDesc.getCodecContext() );
17022

17123
// display Options
172-
for( auto option : options )
24+
for( auto option : optionLoader.getOptions() )
17325
{
17426
std::cout << std::left;
17527
std::cout << "****************************" << std::endl;

src/AvTranscoder/OptionLoader.cpp

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
#include "OptionLoader.hpp"
2+
3+
#include <AvTranscoder/Options/OptionInt.hpp>
4+
#include <AvTranscoder/Options/OptionDouble.hpp>
5+
#include <AvTranscoder/Options/OptionString.hpp>
6+
#include <AvTranscoder/Options/OptionBoolean.hpp>
7+
#include <AvTranscoder/Options/OpionRatio.hpp>
8+
#include <AvTranscoder/Options/OptionGroup.hpp>
9+
#include <AvTranscoder/Options/OptionChoice.hpp>
10+
11+
#include <exception>
12+
#include <string>
13+
14+
namespace avtranscoder
15+
{
16+
17+
OptionLoader::OptionLoader()
18+
: m_options()
19+
{
20+
21+
}
22+
23+
void OptionLoader::loadOptions( void* av_class )
24+
{
25+
// tmp vectors to access easely to the OptionChoice/OptionGroup to add choice / boolean to them
26+
std::vector<avtranscoder::OptionChoice*> optionsChoice;
27+
std::vector<avtranscoder::OptionGroup*> optionsGroup;
28+
try
29+
{
30+
const AVOption* avOption = NULL;
31+
32+
while( ( avOption = av_opt_next( av_class, avOption ) ) != NULL )
33+
{
34+
if( !avOption || ! avOption->name )
35+
{
36+
continue;
37+
}
38+
39+
avtranscoder::Option* opt = NULL;
40+
41+
//std::cout << "The option is " << avOption->name << " of type : " << avOption->type << std::endl;
42+
43+
if( avOption->unit && avOption->type == AV_OPT_TYPE_FLAGS )
44+
{
45+
opt = new avtranscoder::OptionGroup( *avOption );
46+
m_options.push_back( opt );
47+
optionsGroup.push_back( dynamic_cast<avtranscoder::OptionGroup*>( opt ) );
48+
continue;
49+
}
50+
if( avOption->unit && avOption->type == AV_OPT_TYPE_INT )
51+
{
52+
opt = new avtranscoder::OptionChoice( *avOption );
53+
m_options.push_back( opt );
54+
optionsChoice.push_back( dynamic_cast<avtranscoder::OptionChoice*>( opt ) );
55+
continue;
56+
}
57+
58+
switch( avOption->type )
59+
{
60+
case AV_OPT_TYPE_FLAGS:
61+
{
62+
opt = new avtranscoder::OptionBoolean( *avOption );
63+
break;
64+
}
65+
case AV_OPT_TYPE_INT:
66+
case AV_OPT_TYPE_INT64:
67+
{
68+
opt = new avtranscoder::OptionInt( *avOption );
69+
break;
70+
}
71+
case AV_OPT_TYPE_DOUBLE:
72+
case AV_OPT_TYPE_FLOAT:
73+
{
74+
opt = new avtranscoder::OptionDouble( *avOption );
75+
break;
76+
}
77+
case AV_OPT_TYPE_STRING:
78+
{
79+
opt = new avtranscoder::OptionString( *avOption );
80+
break;
81+
}
82+
case AV_OPT_TYPE_RATIONAL:
83+
{
84+
opt = new avtranscoder::OpionRatio( *avOption );
85+
break;
86+
}
87+
case AV_OPT_TYPE_BINARY:
88+
{
89+
opt = new avtranscoder::OptionString( *avOption );
90+
break;
91+
}
92+
case AV_OPT_TYPE_CONST:
93+
{
94+
break;
95+
}
96+
default:
97+
{
98+
//std::cout << "----- Unknowed type for " << avOption->name << "-----" << std::endl;
99+
break;
100+
}
101+
}
102+
if( opt )
103+
m_options.push_back( opt );
104+
}
105+
106+
// adding enum values and set default value for enums
107+
avOption = NULL;
108+
while( (avOption = av_opt_next( av_class, avOption) ) != NULL )
109+
{
110+
if( !avOption ||
111+
!avOption->name ||
112+
( avOption->unit && avOption->type == AV_OPT_TYPE_FLAGS ) ||
113+
( avOption->unit && avOption->type == AV_OPT_TYPE_INT ) )
114+
{
115+
continue;
116+
}
117+
118+
avtranscoder::OptionBoolean* optBoolean = NULL;
119+
120+
switch( avOption->type )
121+
{
122+
case AV_OPT_TYPE_CONST:
123+
{
124+
for( size_t i = 0; i < optionsChoice.size(); i++ )
125+
{
126+
if( avOption->unit == optionsChoice.at( i )->getUnit() )
127+
{
128+
if( avOption->help )
129+
optionsChoice.at( i )->appendChoice( avOption->name, avOption->help );
130+
else
131+
optionsChoice.at( i )->appendChoice( avOption->name );
132+
133+
double valueDouble;
134+
if( avOption->default_val.dbl == optionsChoice.at( i )->getDefaultValue( valueDouble ) )
135+
optionsChoice.at( i )->setDefaultChoiceIndex( optionsChoice.at( i )->getNbChoices() - 1 );
136+
}
137+
}
138+
139+
for( size_t i = 0; i < optionsGroup.size(); i++ )
140+
{
141+
std::string name = "g_";
142+
name += avOption->unit;
143+
if( name == optionsGroup.at( i )->getName() )
144+
{
145+
optBoolean = new avtranscoder::OptionBoolean( *avOption );
146+
optionsGroup.at( i )->appendElement( *optBoolean );
147+
break;
148+
}
149+
}
150+
}
151+
default:
152+
{
153+
break;
154+
}
155+
}
156+
}
157+
}
158+
159+
catch( std::exception &e )
160+
{
161+
for( std::vector<Option*>::iterator it = m_options.begin(); it != m_options.end(); ++it)
162+
{
163+
delete *it;
164+
}
165+
m_options.clear();
166+
167+
throw e;
168+
}
169+
}
170+
171+
}

src/AvTranscoder/OptionLoader.hpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef _AV_TRANSCODER_OPTION_LOADER_HPP
2+
#define _AV_TRANSCODER_OPTION_LOADER_HPP
3+
4+
#include <AvTranscoder/Option.hpp>
5+
6+
#include <vector>
7+
8+
namespace avtranscoder
9+
{
10+
11+
/**
12+
* @brief Manage a list of Option.
13+
* The list is filled by loading options from a libav / ffmpeg object.
14+
*/
15+
class OptionLoader
16+
{
17+
public:
18+
OptionLoader();
19+
20+
std::vector<Option*>& getOptions() { return m_options; }
21+
22+
void loadOptions( void* av_class );
23+
24+
private:
25+
std::vector<Option*> m_options;
26+
};
27+
28+
}
29+
30+
#endif

0 commit comments

Comments
 (0)