@@ -27,29 +27,49 @@ StreamTranscoder::~StreamTranscoder()
27
27
28
28
void StreamTranscoder::init ( const std::string& profile )
29
29
{
30
- if ( profile.empty () )
31
- {
32
- return ;
33
- }
34
-
35
- _transcodeStream = true ;
36
-
30
+ _transcodeStream = profile.size ();
31
+
37
32
switch ( _stream->getStreamType () )
38
33
{
39
34
case AVMEDIA_TYPE_VIDEO :
40
35
{
41
36
_inputStreamReader = new InputStreamVideo ( *_stream );
42
- _outputStreamWriter = new OutputStreamVideo ();
43
- _outputStreamWriter->setProfile ( profile );
44
- _frameBuffer = new Image ( _stream->getVideoDesc ().getImageDesc () );
37
+ _inputStreamReader->setup ();
38
+
39
+ if ( ! profile.empty () )
40
+ {
41
+ _outputStreamWriter = new OutputStreamVideo ();
42
+ OutputStreamVideo* outputStreamVideo = static_cast <OutputStreamVideo*>( _outputStreamWriter );
43
+
44
+ outputStreamVideo->setProfile ( profile );
45
+ _outputFile->addVideoStream ( outputStreamVideo->getVideoDesc () );
46
+ _frameBuffer = new Image ( outputStreamVideo->getVideoDesc ().getImageDesc () );
47
+ }
48
+ else
49
+ {
50
+ _outputFile->addVideoStream ( _stream->getVideoDesc () );
51
+ }
52
+
45
53
break ;
46
54
}
47
55
case AVMEDIA_TYPE_AUDIO :
48
56
{
49
57
_inputStreamReader = new InputStreamAudio ( *_stream );
50
- _outputStreamWriter = new OutputStreamAudio ();
51
- _outputStreamWriter->setProfile ( profile );
52
- _frameBuffer = new AudioFrame ( _stream->getAudioDesc ().getFrameDesc () );
58
+ _inputStreamReader->setup ();
59
+ if ( ! profile.empty () )
60
+ {
61
+ _outputStreamWriter = new OutputStreamAudio ();
62
+ OutputStreamAudio* outputStreamAudio = static_cast <OutputStreamAudio*>( _outputStreamWriter );
63
+
64
+ outputStreamAudio->setProfile ( profile );
65
+ _outputFile->addAudioStream ( outputStreamAudio->getAudioDesc () );
66
+ _frameBuffer = new AudioFrame ( outputStreamAudio->getAudioDesc ().getFrameDesc () );
67
+ }
68
+ else
69
+ {
70
+ _outputFile->addAudioStream ( _stream->getAudioDesc () );
71
+ }
72
+
53
73
break ;
54
74
}
55
75
default :
@@ -62,13 +82,22 @@ bool StreamTranscoder::processFrame()
62
82
DataStream dataStream;
63
83
if ( ! _transcodeStream )
64
84
{
65
- _stream->readNextPacket ( dataStream );
85
+ if ( ! _stream->readNextPacket ( dataStream ) )
86
+ return false ;
66
87
_outputFile->wrap ( dataStream, _streamIndex );
67
88
return true ;
68
89
}
69
- // transcodes
70
- _inputStreamReader->readNextFrame ( *_frameBuffer );
71
- _outputStreamWriter->encodeFrame ( *_frameBuffer, dataStream );
90
+
91
+ // std::cout << "encode & wrap" << _streamIndex << std::endl;
92
+
93
+ if ( _inputStreamReader->readNextFrame ( *_frameBuffer ) )
94
+ {
95
+ _outputStreamWriter->encodeFrame ( *_frameBuffer, dataStream );
96
+ }
97
+ else if ( ! _outputStreamWriter->encodeFrame ( dataStream ) )
98
+ {
99
+ return false ;
100
+ }
72
101
73
102
_outputFile->wrap ( dataStream, _streamIndex );
74
103
return true ;
0 commit comments