Skip to content

Commit 9503a24

Browse files
start adding audio decoding
1 parent e6ec153 commit 9503a24

File tree

13 files changed

+245
-48
lines changed

13 files changed

+245
-48
lines changed

SConstruct

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ env.Append(
2929
LIBPATH = [
3030
libavLibDir,
3131
"#src",
32-
"#build/src"
32+
"#build/src"
3333
],
3434
)
3535

@@ -72,7 +72,6 @@ envPy.Replace(
7272
SWIGCXXFILESUFFIX= '_wrapPython$CXXFILESUFFIX',
7373
SHLIBPREFIX= '_',
7474
CXXFLAGS = [
75-
'-std=gnu++0x',
7675
'-Wall',
7776
],
7877
SWIGFLAGS = [

app/avTranscoder/avTranscoder.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,17 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
2020
using namespace avtranscoder;
2121

2222
av_log_set_level( AV_LOG_FATAL );
23-
av_log_set_level( AV_LOG_DEBUG );
23+
//av_log_set_level( AV_LOG_DEBUG );
2424

2525
InputFile inputFile( inputfilename );
2626
inputFile.analyse();
2727

2828
// init video decoders
2929
InputStreamVideo inputStreamVideo( inputFile.getStream( 0 ) );
3030

31-
//dVideo.set( key, value );
32-
33-
// same as
34-
//DecoderVideo dVideo( "inputFilename.mov", 1 );
35-
3631
// init audio decoders
37-
InputStreamAudio isAudioLeft ( "inputFilename.wav" ); // take the first audio stream per default
38-
InputStreamAudio isAudioRight( "inputFilename.wav", 2 );
32+
InputStreamAudio inputStreamAudio( inputFile.getStream( 1 ) );
33+
//InputStreamAudio inputStreamAudioRight( inputFile.getStream( 2 ) );
3934

4035
// init video & audio encoders
4136
OutputStreamVideo outputStreamVideo;
@@ -55,7 +50,8 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
5550
Image sourceImage( imageDesc );
5651

5752
videoDesc.setVideoCodec( "mpeg2video" );
58-
videoDesc.set( "b",50000000 );
53+
videoDesc.set( "b", 5000 );
54+
5955
try
6056
{
6157
videoDesc.set( "unknownParameter", 120000000 );
@@ -112,6 +108,11 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
112108
113109
wrapper.createAudioEncoder( eAudioLeft, 2 );*/
114110

111+
AudioFrameDesc audioFrameDesc;
112+
AudioFrame sourceAudio( audioFrameDesc );
113+
114+
115+
115116
ColorTransform ct;
116117

117118

@@ -120,7 +121,7 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
120121

121122
size_t frame = 0;
122123

123-
while( inputStreamVideo.readNextFrame( sourceImage ) )
124+
while( inputStreamVideo.readNextFrame( sourceImage ) && inputStreamAudio.readNextFrame( sourceAudio ) )
124125
{
125126
std::cout << "\rprocess frame " << frame << std::flush;
126127

@@ -146,7 +147,7 @@ int main( int argc, char** argv )
146147
std::cout << "start ..." << std::endl;
147148

148149
// example of video Transcoding
149-
transcodeVideo( argv[1], "transcodedVideo.mxf" );
150+
transcodeVideo( argv[1], "transcodedVideo.avi" );
150151

151152
std::cout << "end ..." << std::endl;
152153
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#ifndef _AV_TRANSCODER_DATA_AUDIO_FRAME_HPP_
2+
#define _AV_TRANSCODER_DATA_AUDIO_FRAME_HPP_
3+
4+
#include <AvTranscoder/common.hpp>
5+
6+
extern "C" {
7+
#ifndef __STDC_CONSTANT_MACROS
8+
#define __STDC_CONSTANT_MACROS
9+
#endif
10+
#ifndef INT64_C
11+
#define INT64_C(c) (c ## LL)
12+
#define UINT64_C(c) (c ## ULL)
13+
#endif
14+
#include <libavcodec/avcodec.h>
15+
}
16+
17+
#include <iostream>
18+
#include <string>
19+
#include <vector>
20+
#include <stdexcept>
21+
22+
//#include "Sample.hpp"
23+
24+
namespace avtranscoder
25+
{
26+
27+
typedef std::vector< unsigned char > DataBuffer;
28+
29+
class AudioFrameDesc
30+
{
31+
public:
32+
AudioFrameDesc()
33+
{};
34+
35+
size_t getDataSize() const
36+
{
37+
size_t size = 0;
38+
return size;
39+
}
40+
41+
private:
42+
};
43+
44+
class AudioFrame
45+
{
46+
public:
47+
AudioFrame( const AudioFrameDesc& ref )
48+
: m_dataBuffer( ref.getDataSize(), 0 )
49+
, m_audioFrameDesc( ref )
50+
{ }
51+
52+
const AudioFrameDesc& desc() const { return m_audioFrameDesc; }
53+
DataBuffer& getBuffer() { return m_dataBuffer; }
54+
unsigned char* getPtr() { return &m_dataBuffer[0]; }
55+
#ifndef SWIG
56+
const unsigned char* getPtr() const { return &m_dataBuffer[0]; }
57+
#endif
58+
size_t getSize() const { return m_dataBuffer.size(); }
59+
60+
private:
61+
DataBuffer m_dataBuffer;
62+
const AudioFrameDesc m_audioFrameDesc;
63+
};
64+
65+
}
66+
67+
#endif

src/AvTranscoder/DatasStructures/Image.hpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ extern "C" {
1717
#include <iostream>
1818
#include <string>
1919
#include <vector>
20+
#include <stdexcept>
21+
2022
#include "Pixel.hpp"
2123

2224
namespace avtranscoder
@@ -51,7 +53,17 @@ class ImageDesc
5153

5254
size_t getDataSize() const
5355
{
54-
return avpicture_get_size( m_pixel.findPixel(), m_width, m_height );
56+
AVPixelFormat pixelFormat = m_pixel.findPixel();
57+
if( pixelFormat == AV_PIX_FMT_NONE )
58+
{
59+
throw std::runtime_error( "incorrect pixel description" );
60+
}
61+
size_t size = avpicture_get_size( pixelFormat, m_width, m_height );
62+
if( size == 0 )
63+
{
64+
throw std::runtime_error( "unable to determine image buffer size" );
65+
}
66+
return size;
5567
}
5668

5769
private:

src/AvTranscoder/InputFile.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ InputFile& InputFile::analyse()
120120

121121
InputStream InputFile::getStream( size_t index )
122122
{
123-
InputStream inputStream( m_filename, index );
123+
return InputStream( m_filename, index );
124124
}
125125

126126
}

src/AvTranscoder/InputStream.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ bool InputStream::readNextPacket( DataStream& data ) const
5252

5353
bool InputStream::readNextPacket( AVPacket& packet ) const
5454
{
55+
assert( m_formatContext != NULL );
5556
while( 1 )
5657
{
5758
int ret = av_read_frame( m_formatContext, &packet );
@@ -70,7 +71,6 @@ bool InputStream::readNextPacket( AVPacket& packet ) const
7071

7172
VideoDesc InputStream::getVideoDesc() const
7273
{
73-
std::cout << "get video desc on " << m_formatContext << " / " << m_streamIndex << std::endl;
7474
assert( m_formatContext != NULL );
7575
assert( m_streamIndex <= m_formatContext->nb_streams );
7676

@@ -81,8 +81,6 @@ VideoDesc InputStream::getVideoDesc() const
8181

8282
AVCodecContext* codecContext = m_formatContext->streams[m_streamIndex]->codec;
8383

84-
std::cout << "get video desc with codec id " << codecContext << std::endl;
85-
8684
VideoDesc desc( codecContext->codec_id );
8785

8886
desc.setImageParameters( codecContext->width, codecContext->height, codecContext->pix_fmt );
@@ -93,7 +91,9 @@ VideoDesc InputStream::getVideoDesc() const
9391

9492
AudioDesc InputStream::getAudioDesc() const
9593
{
94+
assert( m_formatContext != NULL );
9695
assert( m_streamIndex <= m_formatContext->nb_streams );
96+
9797
if( m_formatContext->streams[m_streamIndex]->codec->codec_type != AVMEDIA_TYPE_AUDIO )
9898
{
9999
return AudioDesc( AV_CODEC_ID_NONE );

src/AvTranscoder/InputStream.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ extern "C" {
1313
}
1414

1515
#include <string>
16+
#include <iostream>
1617

1718
namespace avtranscoder
1819
{
@@ -23,11 +24,18 @@ class InputStream
2324
InputStream( const std::string& filename, const size_t streamIndex );
2425
~InputStream( );
2526

27+
InputStream( const InputStream& inputStream )
28+
: m_formatContext( NULL )
29+
, m_streamIndex( inputStream.m_streamIndex )
30+
{
31+
init( inputStream.m_formatContext->filename );
32+
}
33+
2634
InputStream( InputStream& inputStream )
27-
: m_streamIndex( inputStream.m_streamIndex )
35+
: m_formatContext( NULL )
36+
, m_streamIndex( inputStream.m_streamIndex )
2837
{
2938
init( inputStream.m_formatContext->filename );
30-
//m_streamIndex = inputStream.m_streamIndex;
3139
}
3240

3341
size_t getStreamIndex() const { return m_streamIndex; }

src/AvTranscoder/InputStreamAudio.cpp

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,99 @@
1-
#include "InputStreamAudio.hpp"
1+
#include "InputStreamAudio.hpp"
2+
#include "common.hpp"
3+
4+
extern "C" {
5+
#ifndef __STDC_CONSTANT_MACROS
6+
#define __STDC_CONSTANT_MACROS
7+
#endif
8+
#include <libavcodec/avcodec.h>
9+
#include <libavformat/avformat.h>
10+
#include <libavutil/avutil.h>
11+
#include <libavutil/pixdesc.h>
12+
}
13+
14+
#include <iostream>
15+
#include <stdexcept>
16+
17+
namespace avtranscoder
18+
{
19+
20+
InputStreamAudio::InputStreamAudio( const InputStream& inputStream )
21+
: m_inputStream ( inputStream )
22+
, m_codec ( NULL )
23+
, m_codecContext ( NULL )
24+
, m_frame ( NULL )
25+
, m_selectedStream( -1 )
26+
{
27+
av_register_all();
28+
29+
m_codec = avcodec_find_decoder( m_inputStream.getAudioDesc().getAudioCodecId() );
30+
if( m_codec == NULL )
31+
{
32+
throw std::runtime_error( "codec not supported" );
33+
}
34+
35+
m_codecContext = avcodec_alloc_context3( m_codec );
36+
if( m_codecContext == NULL )
37+
{
38+
throw std::runtime_error( "unable to find context for codec" );
39+
}
40+
41+
avcodec_open2( m_codecContext, m_codec, NULL );
42+
if( m_codecContext == NULL || m_codec == NULL )
43+
{
44+
throw std::runtime_error( "unable open codec" );
45+
}
46+
47+
m_frame = avcodec_alloc_frame();
48+
if( m_frame == NULL )
49+
{
50+
throw std::runtime_error( "unable to setup frame buffer" );
51+
}
52+
}
53+
54+
InputStreamAudio::~InputStreamAudio()
55+
{
56+
if( m_codecContext != NULL )
57+
{
58+
avcodec_close( m_codecContext );
59+
av_free( m_codecContext );
60+
m_codecContext = NULL;
61+
}
62+
if( m_frame != NULL )
63+
{
64+
//av_frame_free( &m_frame );
65+
m_frame = NULL;
66+
}
67+
}
68+
69+
bool InputStreamAudio::readNextFrame( AudioFrame& audioFrameBuffer )
70+
{
71+
/* int got_frame = 0;
72+
73+
while( ! got_frame )
74+
{
75+
AVPacket packet;
76+
av_init_packet( &packet );
77+
78+
if( ! m_inputStream.readNextPacket( packet ) ) // error or end of file
79+
{
80+
av_free_packet( &packet );
81+
return false;
82+
}
83+
84+
//avcodec_decode_audio2( m_codecContext, m_frame, &got_frame, &packet );
85+
86+
av_free_packet( &packet );
87+
}
88+
89+
size_t decodedSize = avpicture_get_size( (AVPixelFormat)m_frame->format, m_frame->width, m_frame->height );
90+
if( frameBuffer.getBuffer().size() != decodedSize )
91+
frameBuffer.getBuffer().resize( avpicture_get_size( (AVPixelFormat)m_frame->format, m_frame->width, m_frame->height ) );
92+
93+
// Copy pixel data from an AVPicture into one contiguous buffer.
94+
avpicture_layout( (AVPicture*)m_frame, (AVPixelFormat)m_frame->format, m_frame->width, m_frame->height, &frameBuffer.getBuffer()[0], frameBuffer.getBuffer().size() );
95+
*/
96+
return true;
97+
}
98+
99+
}

src/AvTranscoder/InputStreamAudio.hpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,26 @@
22
#define _AV_TRANSCODER_INPUT_STREAM_AUDIO_HPP_
33

44
#include "InputStream.hpp"
5+
#include "DatasStructures/AudioFrame.hpp"
56

67
namespace avtranscoder
78
{
89

910
class InputStreamAudio
1011
{
1112
public:
12-
InputStreamAudio( const std::string& filename = "", const size_t streamIndex = 0 )
13-
{};
13+
InputStreamAudio( const InputStream& inputStream );
14+
~InputStreamAudio();
15+
16+
bool readNextFrame( AudioFrame& audioFrameBuffer );
17+
18+
private:
19+
const InputStream m_inputStream;
20+
AVCodec* m_codec;
21+
AVCodecContext* m_codecContext;
22+
AVFrame* m_frame;
23+
24+
int m_selectedStream;
1425

1526
private:
1627

src/AvTranscoder/InputStreamVideo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ InputStreamVideo::~InputStreamVideo()
6464
}
6565
if( m_frame != NULL )
6666
{
67-
av_frame_free( &m_frame );
67+
//av_frame_free( &m_frame );
6868
m_frame = NULL;
6969
}
7070
}

0 commit comments

Comments
 (0)