Skip to content

Commit 20c17b2

Browse files
committed
Merge pull request #224 from cchampet/dev_addReaderClasses
Add reader classes
2 parents 45922a3 + 585a888 commit 20c17b2

29 files changed

+693
-343
lines changed

app/avPlay/AvReader.cpp

Lines changed: 0 additions & 85 deletions
This file was deleted.

app/avPlay/AvReader.hpp

Lines changed: 0 additions & 41 deletions
This file was deleted.

app/avPlay/Reader.hpp

Lines changed: 0 additions & 27 deletions
This file was deleted.

app/avPlay/Window.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <iomanip>
1515
#include <cstring>
1616

17-
Reader* Window::_reader = NULL;
17+
avtranscoder::VideoReader* Window::_reader = NULL;
1818

1919
size_t Window::_width = 0;
2020
size_t Window::_height = 0;
@@ -94,7 +94,7 @@ void loadNewTexture( const char* data, GLint internalFormat, size_t width, size_
9494
loadNewTexture( _imageProperties );
9595
}
9696

97-
Window::Window( Reader& reader )
97+
Window::Window( avtranscoder::VideoReader& reader )
9898
{
9999
_reader = &reader;
100100
_width = _reader->getWidth();
@@ -124,7 +124,7 @@ Window::Window( Reader& reader )
124124

125125
void Window::launch()
126126
{
127-
displayNextFrame();
127+
displayFirstFrame();
128128
glutMainLoop();
129129
}
130130

@@ -220,11 +220,6 @@ void Window::keyboard( unsigned char k, int x, int y )
220220
case 'a':
221221
showAlphaChannelTexture();
222222
break;
223-
224-
case 'm':
225-
_reader->printMetadatas();
226-
break;
227-
228223
case 'H':
229224
if( shift )
230225
{
@@ -398,8 +393,7 @@ void Window::displayHelp()
398393
{
399394
static const std::string kViewerHelp =
400395
"Av Player Viewer Help\n" \
401-
"i : information about image (dimensions, bit depth, channels)\n"\
402-
"m : full metadatas of media\n"\
396+
"i : information about image (dimensions, bit depth, channels) + video stream\n"\
403397
"z : zoom view to 1:1\n"\
404398
"h, F1 : print help\n" \
405399
"SHIFT + V : flip\n" \
@@ -425,6 +419,9 @@ void Window::displayInformations()
425419
case GL_FLOAT : textureType += "32 float"; break;
426420
}
427421
std::cout << textureType << " " << _width << "x" << _height << std::endl;
422+
423+
// stream info
424+
_reader->printInfo();
428425
}
429426

430427
void Window::move( float x, float y )
@@ -532,14 +529,16 @@ void Window::showAlphaChannelTexture( )
532529

533530
void Window::displayNextFrame()
534531
{
535-
const char* buffer = _reader->readNextFrame();
532+
const char* buffer = (const char*)_reader->readNextFrame()->getData();
536533
loadNewTexture( buffer, _reader->getComponents(), _reader->getWidth(), _reader->getHeight(), GL_RGB, GL_UNSIGNED_BYTE );
534+
display();
537535
}
538536

539537
void Window::displayPrevFrame()
540538
{
541-
const char* buffer = _reader->readPrevFrame();
539+
const char* buffer = (const char*)_reader->readPrevFrame()->getData();
542540
loadNewTexture( buffer, _reader->getComponents(), _reader->getWidth(), _reader->getHeight(), GL_RGB, GL_UNSIGNED_BYTE );
541+
display();
543542
}
544543

545544
void Window::displayFirstFrame()
@@ -549,8 +548,9 @@ void Window::displayFirstFrame()
549548

550549
void Window::displayAtFrame( const size_t frame )
551550
{
552-
const char* buffer = _reader->readFrameAt( frame );
551+
const char* buffer = (const char*)_reader->readFrameAt( frame )->getData();
553552
loadNewTexture( buffer, _reader->getComponents(), _reader->getWidth(), _reader->getHeight(), GL_RGB, GL_UNSIGNED_BYTE );
553+
display();
554554
}
555555

556556
void Window::loopPlaying( int value )

app/avPlay/Window.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33

44
#include <string>
55

6-
#include "Reader.hpp"
6+
#include <AvTranscoder/reader/VideoReader.hpp>
77

88
class Window
99
{
1010
public:
11-
Window( Reader& reader );
11+
Window( avtranscoder::VideoReader& reader );
1212

1313
void launch();
1414

@@ -43,7 +43,7 @@ class Window
4343

4444
static void loopPlaying( int value );
4545

46-
static Reader* _reader;
46+
static avtranscoder::VideoReader* _reader;
4747

4848
static size_t _width;
4949
static size_t _height;

app/avPlay/main.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
#include <AvTranscoder/common.hpp>
2+
#include <AvTranscoder/reader/VideoReader.hpp>
23

3-
#include "AvReader.hpp"
44
#include "Window.hpp"
55

66

77
int main( int argc, char** argv )
88
{
99
avtranscoder::preloadCodecsAndFormats();
1010

11-
AvReader avReader( argv[1] );
12-
Window window( avReader );
11+
if(argc < 2)
12+
{
13+
std::cout << "avplay can play the given video media file." << std::endl;
14+
std::cout << "Provide the filename and the streamIndex (0 by default)" << std::endl;
15+
return( -1 );
16+
}
17+
18+
const std::string filename(argv[1]);
19+
const size_t streamIndex = argc > 2 ? atoi(argv[2]) : 0;
20+
21+
avtranscoder::VideoReader reader( filename, streamIndex );
22+
Window window( reader );
1323
window.launch();
14-
}
24+
}

src/AvTranscoder/avTranscoder.i

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@
3939
%include "AvTranscoder/file/file.i"
4040
%include "AvTranscoder/stat/stat.i"
4141
%include "AvTranscoder/transcoder/transcoder.i"
42+
%include "AvTranscoder/reader/reader.i"

src/AvTranscoder/decoder/AudioDecoder.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,9 @@ bool AudioDecoder::decodeNextFrame()
181181
return true;
182182
}
183183

184+
void AudioDecoder::flushDecoder()
185+
{
186+
avcodec_flush_buffers( &_inputStream->getAudioCodec().getAVCodecContext() );
187+
}
188+
184189
}

src/AvTranscoder/decoder/AudioDecoder.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class AvExport AudioDecoder : public IDecoder
2121
bool decodeNextFrame( Frame& frameBuffer );
2222
bool decodeNextFrame( Frame& frameBuffer, const size_t subStreamIndex );
2323

24+
void flushDecoder();
25+
2426
private:
2527
bool decodeNextFrame();
2628

src/AvTranscoder/decoder/IDecoder.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ class AvExport IDecoder
4141
* @param inputFrame: the new next frame
4242
*/
4343
virtual void setNextFrame( Frame& inputFrame ) {}
44+
45+
/**
46+
* @brief Reset the internal decoder state / flush internal buffers.
47+
* @note Should be called when seeking or when switching to a different stream.
48+
* @note Not sense for generators.
49+
*/
50+
virtual void flushDecoder() {}
4451
};
4552

4653
}

src/AvTranscoder/file/FormatContext.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,19 @@ AVStream& FormatContext::addAVStream( const AVCodec& avCodec )
142142
return *stream;
143143
}
144144

145-
void FormatContext::seek( uint64_t position, const int flag )
145+
bool FormatContext::seek( uint64_t position, const int flag )
146146
{
147147
if( (int)getStartTime() != AV_NOPTS_VALUE )
148148
position += getStartTime();
149149

150-
if( av_seek_frame( _avFormatContext, -1, position, flag ) < 0 )
150+
int err = av_seek_frame( _avFormatContext, -1, position, flag );
151+
if( err < 0 )
151152
{
152153
LOG_ERROR( "Error when seek at " << position << " (in AV_TIME_BASE units) in file" )
154+
LOG_ERROR( getDescriptionFromErrorCode( err ) )
155+
return false;
153156
}
157+
return true;
154158
}
155159

156160
std::vector<Option> FormatContext::getOptions()

src/AvTranscoder/file/FormatContext.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ class AvExport FormatContext
7878
* @param position: can be in AV_TIME_BASE units, in frames... depending on the flag value
7979
* @param flag: seeking mode (AVSEEK_FLAG_xxx)
8080
* @note before seek, add offset of start time
81+
* @return seek status
8182
*/
82-
void seek( uint64_t position, const int flag );
83+
bool seek( uint64_t position, const int flag );
8384

8485
size_t getNbStreams() const { return _avFormatContext->nb_streams; }
8586
/// Get duration of the program, in seconds

src/AvTranscoder/file/InputFile.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,16 @@ bool InputFile::readNextPacket( CodedData& data, const size_t streamIndex )
8383
return true;
8484
}
8585

86-
void InputFile::seekAtFrame( const size_t frame, const int flag )
86+
bool InputFile::seekAtFrame( const size_t frame, const int flag )
8787
{
8888
uint64_t position = frame / getFps() * AV_TIME_BASE;
89-
_formatContext.seek( position, flag );
89+
return _formatContext.seek( position, flag );
9090
}
9191

92-
void InputFile::seekAtTime( const double time, const int flag )
92+
bool InputFile::seekAtTime( const double time, const int flag )
9393
{
9494
uint64_t position = time * AV_TIME_BASE;
95-
_formatContext.seek( position, flag );
95+
return _formatContext.seek( position, flag );
9696
}
9797

9898
void InputFile::activateStream( const size_t streamIndex, bool activate )

0 commit comments

Comments
 (0)