Skip to content

Commit 7cad048

Browse files
Merge pull request #26 from MarcAntoine-Arnaud/master
Update API
2 parents 8ea9d8e + cdfe549 commit 7cad048

36 files changed

+434
-167
lines changed

SConstruct

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ resampleLibraryName = 'avresample'
128128
if not conf.CheckLibWithHeader('avutil', 'libavutil/avutil.h', 'c'):
129129
sys.exit( 0 )
130130

131+
if not conf.CheckLibWithHeader('avresample', 'libavresample/avresample.h', 'c'):
132+
if conf.CheckLibWithHeader('swresample', 'libswresample/swresample.h', 'c'):
133+
resampleLibraryFlag = '-DFF_RESAMPLE_LIBRARY'
134+
resampleLibraryName = 'swresample'
135+
131136
if not conf.CheckLibWithHeader('avcodec', 'libavcodec/avcodec.h', 'c'):
132137
sys.exit( 0 )
133138

@@ -137,10 +142,6 @@ if not conf.CheckLibWithHeader('avformat', 'libavformat/avformat.h', 'c'):
137142
if not conf.CheckLibWithHeader('swscale', 'libswscale/swscale.h', 'c'):
138143
sys.exit( 0 )
139144

140-
if not conf.CheckLibWithHeader('avresample', 'libavresample/avresample.h', 'c'):
141-
if conf.CheckLibWithHeader('swresample', 'libswresample/swresample.h', 'c'):
142-
resampleLibraryFlag = '-DFF_RESAMPLE_LIBRARY'
143-
resampleLibraryName = 'swresample'
144145

145146
env.Append(
146147
CXXFLAGS = resampleLibraryFlag

app/genericProcessor/genericProcessor.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
#include <sstream>
99
#include <cstdlib>
1010

11-
bool verbose = false;
11+
// bool verbose = false;
12+
bool verbose = true;
1213

1314
void parseConfigFile( const std::string& configFilename, avtranscoder::Transcoder& transcoder, avtranscoder::Profile& profile )
1415
{
@@ -26,9 +27,29 @@ void parseConfigFile( const std::string& configFilename, avtranscoder::Transcode
2627
{
2728
std::string transcodeProfile;
2829
std::getline( is_line, transcodeProfile );
30+
31+
std::stringstream ss( streamId );
32+
size_t streamIndex = 0;
33+
char separator;
34+
int subStreamIndex = -1;
35+
ss >> streamIndex;
36+
ss >> separator;
37+
if( separator == '.' )
38+
ss >> subStreamIndex;
39+
2940
if( verbose )
30-
std::cout << filename << " ( " << streamId << " ) : " << transcodeProfile << std::endl;
31-
transcoder.add( filename, atoi( streamId.c_str() ), transcodeProfile );
41+
{
42+
std::cout << ( filename.length() ? filename : "dummy stream" );
43+
std::cout << " ( " << streamIndex;
44+
if( subStreamIndex > -1 )
45+
std::cout << " | " << subStreamIndex << " ";
46+
std::cout << " ) : ";
47+
std::cout << ( transcodeProfile.length() ? transcodeProfile : "rewrap" );
48+
std::cout << std::endl;
49+
}
50+
51+
transcoder.add( filename, streamIndex, subStreamIndex, transcodeProfile );
52+
3253
}
3354
}
3455
}

src/AvTranscoder/CodedStream/AvInputStream.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,16 @@ AvInputStream::AvInputStream( InputFile& inputFile, const size_t streamIndex )
3636
, _streamIndex( streamIndex )
3737
, _bufferized( false )
3838
{
39-
if( _inputFile->getFormatContext().streams[_streamIndex]->codec->codec_type == AVMEDIA_TYPE_AUDIO )
40-
_inputFile->getFormatContext().streams[_streamIndex]->codec->block_align = 5760;
39+
AVCodecContext* context = _inputFile->getFormatContext().streams[_streamIndex]->codec;
40+
if( context->codec_type == AVMEDIA_TYPE_AUDIO )
41+
{
42+
double outputFps = 25;
43+
size_t bytePerSample = av_get_bytes_per_sample( context->sample_fmt );
44+
45+
context->block_align = 1.0 * context->sample_rate * context->channels * bytePerSample / outputFps;
46+
// std::cout << "channels " << context->channel_layout << std::endl;
47+
// std::cout << "audio buffer read size " << context->block_align << std::endl;
48+
}
4149
}
4250

4351
AvInputStream::~AvInputStream( )

src/AvTranscoder/DatasStructures/AudioDesc.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ void AudioDesc::set( const std::string& key, const std::string& value )
188188
std::string AudioDesc::getAudioCodec() const
189189
{
190190
assert( m_codecContext != NULL );
191-
return m_codecContext->codec_name;
191+
return avcodec_descriptor_get( m_codecContext->codec_id )->name;
192192
}
193193

194194
AVCodecID AudioDesc::getAudioCodecId() const
@@ -197,7 +197,6 @@ AVCodecID AudioDesc::getAudioCodecId() const
197197
return m_codecContext->codec_id;
198198
}
199199

200-
201200
const size_t AudioDesc::getSampleRate() const
202201
{
203202
assert( m_codecContext != NULL );
@@ -224,6 +223,7 @@ AudioFrameDesc AudioDesc::getFrameDesc() const
224223
audioFrameDesc.setChannels( m_codecContext->channels );
225224
audioFrameDesc.setSampleRate( m_codecContext->sample_rate );
226225
audioFrameDesc.setSampleFormat( m_codecContext->sample_fmt );
226+
// audioFrameDesc.setFps( 25 );
227227

228228
return audioFrameDesc;
229229
}

src/AvTranscoder/DatasStructures/Frame.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace avtranscoder
1010
{
1111

12-
typedef std::vector< unsigned char> DataBuffer;
12+
typedef std::vector< unsigned char > DataBuffer;
1313

1414
class AvExport Frame
1515
{

src/AvTranscoder/DatasStructures/Pixel.cpp

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ extern "C" {
1414
namespace avtranscoder
1515
{
1616

17-
Pixel::Pixel( const AVPixelFormat avpixelFormat )
17+
Pixel::Pixel( const std::string& avPixelFormat )
18+
{
19+
init( av_get_pix_fmt( avPixelFormat.c_str() ) );
20+
}
21+
22+
Pixel::Pixel( const AVPixelFormat avPixelFormat )
1823
: m_pixelSize ( 24 )
1924
, m_components ( 3 )
2025
, m_componentType ( eComponentYuv )
@@ -23,33 +28,7 @@ Pixel::Pixel( const AVPixelFormat avpixelFormat )
2328
, m_withAlpha ( false )
2429
, m_planar ( true )
2530
{
26-
const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get( avpixelFormat );
27-
setBitsPerPixel ( av_get_bits_per_pixel( pix_desc ) );
28-
setBigEndian ( pix_desc->flags & PIX_FMT_BE );
29-
setComponents ( pix_desc->nb_components );
30-
setAlpha ( pix_desc->flags & PIX_FMT_ALPHA );
31-
setPlanar ( ( pix_desc->flags & PIX_FMT_PLANAR ) != 0 );
32-
33-
if( pix_desc->nb_components == 1 )
34-
setColorComponents( eComponentGray );
35-
36-
if( pix_desc->flags & PIX_FMT_RGB )
37-
setColorComponents( eComponentRgb );
38-
else
39-
setColorComponents( eComponentYuv );
40-
41-
setSubsampling( eSubsamplingNone );
42-
43-
if( ( pix_desc->log2_chroma_w == true ) &&
44-
( pix_desc->log2_chroma_h == false ) )
45-
{
46-
setSubsampling( eSubsampling422 );
47-
}
48-
if( ( pix_desc->log2_chroma_w == true ) &&
49-
( pix_desc->log2_chroma_h == true ) )
50-
{
51-
setSubsampling( eSubsampling420 );
52-
}
31+
init( avPixelFormat );
5332
}
5433

5534
AVPixelFormat Pixel::findPixel() const
@@ -85,6 +64,37 @@ AVPixelFormat Pixel::findPixel() const
8564
return AV_PIX_FMT_NONE;
8665
}
8766

67+
void Pixel::init( const AVPixelFormat avPixelFormat )
68+
{
69+
const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get( avPixelFormat );
70+
setBitsPerPixel ( av_get_bits_per_pixel( pix_desc ) );
71+
setBigEndian ( pix_desc->flags & PIX_FMT_BE );
72+
setComponents ( pix_desc->nb_components );
73+
setAlpha ( pix_desc->flags & PIX_FMT_ALPHA );
74+
setPlanar ( ( pix_desc->flags & PIX_FMT_PLANAR ) != 0 );
75+
76+
if( pix_desc->nb_components == 1 )
77+
setColorComponents( eComponentGray );
78+
79+
if( pix_desc->flags & PIX_FMT_RGB )
80+
setColorComponents( eComponentRgb );
81+
else
82+
setColorComponents( eComponentYuv );
83+
84+
setSubsampling( eSubsamplingNone );
85+
86+
if( ( pix_desc->log2_chroma_w == true ) &&
87+
( pix_desc->log2_chroma_h == false ) )
88+
{
89+
setSubsampling( eSubsampling422 );
90+
}
91+
if( ( pix_desc->log2_chroma_w == true ) &&
92+
( pix_desc->log2_chroma_h == true ) )
93+
{
94+
setSubsampling( eSubsampling420 );
95+
}
96+
}
97+
8898
bool Pixel::asCorrectColorComponents( const AVPixFmtDescriptor* pix_desc, const EComponentType componentType ) const
8999
{
90100
if( componentType == eComponentRgb && pix_desc->flags & PIX_FMT_RGB )

src/AvTranscoder/DatasStructures/Pixel.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ class Pixel
4444
, m_planar ( true )
4545
{ }
4646

47-
Pixel( const AVPixelFormat avpixelFormat );
47+
Pixel( const std::string& avPixelFormat );
48+
49+
Pixel( const AVPixelFormat avPixelFormat );
4850

4951
void setBitsPerPixel ( const size_t pixelSize ) { m_pixelSize = pixelSize; }
5052
void setBigEndian ( const bool endianess ) { m_endianess = endianess; }
@@ -65,6 +67,8 @@ class Pixel
6567
AVPixelFormat findPixel() const;
6668

6769
private:
70+
void init( const AVPixelFormat avPixelFormat );
71+
6872
bool asCorrectColorComponents( const AVPixFmtDescriptor* pix_desc, const EComponentType componentType ) const;
6973
bool asCorrectSubsampling( const AVPixFmtDescriptor* pix_desc, const ESubsamplingType subsamplingType ) const;
7074

src/AvTranscoder/DatasStructures/VideoDesc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void VideoDesc::setTimeBase( const size_t num, const size_t den, const size_t ti
7878
std::string VideoDesc::getVideoCodec() const
7979
{
8080
assert( m_codecContext != NULL );
81-
return m_codecContext->codec_name;
81+
return avcodec_descriptor_get( m_codecContext->codec_id )->name;
8282
}
8383

8484
AVCodecID VideoDesc::getVideoCodecId() const

src/AvTranscoder/EssenceStream/DummyAudio.cpp

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ DummyAudio::~DummyAudio( )
1515
{
1616
}
1717

18-
void DummyAudio::setAudioDesc( AudioDesc& audioDesc )
18+
void DummyAudio::setAudioDesc( const AudioDesc& audioDesc )
1919
{
2020
_audioDesc = audioDesc;
21+
2122
_frameDesc.setSampleRate ( _audioDesc.getCodecContext()->sample_rate );
2223
_frameDesc.setChannels ( _audioDesc.getCodecContext()->channels );
2324
_frameDesc.setFps ( 25.0 );
@@ -47,28 +48,9 @@ bool DummyAudio::readNextFrame( Frame& frameBuffer )
4748
return true;
4849
}
4950

50-
bool DummyAudio::readNextFrame( std::vector<Frame>& frameBuffer )
51+
bool DummyAudio::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex )
5152
{
52-
if( frameBuffer.size() != _frameDesc.getChannels() )
53-
{
54-
frameBuffer.resize( _frameDesc.getChannels() );
55-
}
56-
57-
size_t dataSizeOneChannel = _frameDesc.getDataSize() / _frameDesc.getChannels();
58-
int fill_char = (
59-
_frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8 ||
60-
_frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8P
61-
) ? 0x80 : 0x00;
62-
63-
for( size_t channel = 0; channel < _frameDesc.getChannels(); ++channel )
64-
{
65-
AudioFrame& audioFrameBuffer = static_cast<AudioFrame&>( frameBuffer.at( channel ) );
66-
audioFrameBuffer.setNbSamples( 1.0 * _frameDesc.getSampleRate() / _frameDesc.getFps() );
67-
frameBuffer.at( channel).getBuffer().resize( dataSizeOneChannel );
68-
memset( frameBuffer.at( channel).getPtr(), fill_char, frameBuffer.at( channel).getSize() );
69-
}
70-
71-
return true;
53+
return false;
7254
}
7355

7456
}

src/AvTranscoder/EssenceStream/DummyAudio.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ class AvExport DummyAudio : public InputEssence
1717
~DummyAudio( );
1818

1919
// Stream properties
20-
void setAudioDesc( AudioDesc& audioDesc );
20+
void setAudioDesc( const AudioDesc& audioDesc );
2121

2222
AudioDesc getAudioDesc() const;
2323

2424
void setup() {}
2525

2626
bool readNextFrame( Frame& frameBuffer );
27-
bool readNextFrame( std::vector<Frame>& frameBuffer );
27+
bool readNextFrame( Frame& frameBuffer, const size_t subStreamIndex );
2828

2929
private:
30-
AudioDesc _audioDesc;
30+
AudioDesc _audioDesc;
3131
AudioFrameDesc _frameDesc;
3232
};
3333

src/AvTranscoder/EssenceStream/DummyVideo.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace avtranscoder
88

99
DummyVideo::DummyVideo( )
1010
: InputEssence( )
11-
, numberOfView( 1 )
11+
, _numberOfView( 1 )
1212
{
1313
}
1414

@@ -37,19 +37,9 @@ bool DummyVideo::readNextFrame( Frame& frameBuffer )
3737
return true;
3838
}
3939

40-
bool DummyVideo::readNextFrame( std::vector<Frame>& frameBuffer )
40+
bool DummyVideo::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex )
4141
{
42-
if( frameBuffer.size() != numberOfView )
43-
{
44-
frameBuffer.resize( numberOfView );
45-
}
46-
47-
for( size_t view = 0; view < numberOfView; ++view )
48-
{
49-
readNextFrame( frameBuffer.at( view ) );
50-
}
51-
52-
return true;
42+
return false;
5343
}
5444

5545
}

src/AvTranscoder/EssenceStream/DummyVideo.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ class AvExport DummyVideo : public InputEssence
2424
void setup() {}
2525

2626
bool readNextFrame( Frame& frameBuffer );
27-
bool readNextFrame( std::vector<Frame>& frameBuffer );
27+
bool readNextFrame( Frame& frameBuffer, const size_t subStreamIndex );
2828

2929
private:
3030
VideoDesc _videoDesc;
3131
ImageDesc _imageDesc;
3232

33-
size_t numberOfView;
33+
size_t _numberOfView;
3434
};
3535

3636
}

src/AvTranscoder/EssenceStream/InputAudio.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,26 +133,44 @@ bool InputAudio::readNextFrame( Frame& frameBuffer )
133133
return true;
134134
}
135135

136-
bool InputAudio::readNextFrame( std::vector<Frame>& frameBuffer )
136+
bool InputAudio::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex )
137137
{
138138
if( ! getNextFrame() )
139139
return false;
140140

141-
size_t nbChannels = av_get_channel_layout_nb_channels( _frame->channel_layout );
141+
size_t decodedSize = av_samples_get_buffer_size(NULL, 1,
142+
_frame->nb_samples,
143+
_codecContext->sample_fmt, 1);
144+
145+
size_t nbChannels = _codecContext->channels;
142146
size_t bytePerSample = av_get_bytes_per_sample( (AVSampleFormat)_frame->format );
143147

144-
frameBuffer.resize( nbChannels );
148+
AudioFrame& audioBuffer = static_cast<AudioFrame&>( frameBuffer );
149+
150+
// std::cout << "needed size " << audioBuffer.desc().getDataSize() << std::endl;
145151

146-
for( size_t channel = 0; channel < nbChannels; ++ channel )
152+
// std::cout << _frame->nb_samples * bytePerSample << std::endl;
153+
//audioBuffer.getBuffer().resize( _frame->nb_samples * bytePerSample );
154+
audioBuffer.setNbSamples( _frame->nb_samples );
155+
156+
if( decodedSize )
147157
{
148-
AudioFrame& audioBuffer = static_cast<AudioFrame&>( frameBuffer.at( channel ) );
149-
audioBuffer.setNbSamples( _frame->nb_samples );
158+
if( audioBuffer.getSize() != decodedSize )
159+
audioBuffer.getBuffer().resize( decodedSize, 0 );
150160

151161
unsigned char* src = *_frame->data;
152162
unsigned char* dst = audioBuffer.getPtr();
153163

164+
src += ( nbChannels - 1 ) - ( subStreamIndex * bytePerSample );
165+
166+
// std::cout << "frame samples count " << _frame->nb_samples << std::endl;
167+
// std::cout << "frame data size " << audioBuffer.getSize() << std::endl;
168+
154169
for( int sample = 0; sample < _frame->nb_samples; ++sample )
155170
{
171+
// std::cout << "sample " << sample << " ==| ";
172+
// std::cout << "src " << static_cast<void *>(src) << " -> ";
173+
// std::cout << "dst " << static_cast<void *>(dst) << std::endl;
156174
memcpy( dst, src, bytePerSample );
157175
dst += bytePerSample;
158176
src += bytePerSample * nbChannels;

0 commit comments

Comments
 (0)