@@ -6,9 +6,10 @@ using namespace std;
66
77namespace ffmpegcpp
88{
9- InputStream::InputStream (AVStream* stream)
9+ InputStream::InputStream (AVFormatContext* format, AVStream* stream)
1010 {
1111 this ->stream = stream;
12+ this ->format = format;
1213
1314 // find decoder for the stream
1415 AVCodec* codec = CodecDeducer::DeduceDecoder (stream->codecpar ->codec_id );
@@ -85,14 +86,43 @@ namespace ffmpegcpp
8586 av_frame_free (&frame);
8687 frame = nullptr ;
8788 }
89+ if (metaData != nullptr )
90+ {
91+ delete metaData;
92+ metaData = nullptr ;
93+ }
8894 }
8995
9096 void InputStream::SetFrameSink (FrameSink* frameSink)
9197 {
9298 output = frameSink->CreateStream ();
9399 }
94100
95- int inputSampleCount = 0 ;
101+ StreamData* InputStream::DiscoverMetaData ()
102+ {
103+ /* metaData = new StreamData();
104+
105+ AVRational* time_base = &timeBaseCorrectedByTicksPerFrame;
106+ if (!timeBaseCorrectedByTicksPerFrame.num)
107+ {
108+ time_base = &stream->time_base;
109+ }
110+
111+ metaData->timeBase.num = time_base->num;
112+ metaData->timeBase.den = time_base->den;*/
113+
114+ AVRational overrideFrameRate;
115+ overrideFrameRate.num = 0 ;
116+
117+ AVRational tb = overrideFrameRate.num ? av_inv_q (overrideFrameRate) : stream->time_base ;
118+ AVRational fr = overrideFrameRate;
119+ if (!fr.num ) fr = av_guess_frame_rate (format, stream, NULL );
120+
121+ StreamData* metaData = new StreamData ();
122+ metaData->timeBase = tb;
123+ metaData->frameRate = fr;
124+ return metaData;
125+ }
96126
97127 void InputStream::DecodePacket (AVPacket *pkt)
98128 {
@@ -122,16 +152,16 @@ namespace ffmpegcpp
122152 frame->sample_aspect_ratio = stream->sample_aspect_ratio ;
123153 }
124154
125- AVRational* time_base = &timeBaseCorrectedByTicksPerFrame;
126- if (!timeBaseCorrectedByTicksPerFrame. num )
155+ // the meta data does not exist yet - we figure it out!
156+ if (metaData == nullptr )
127157 {
128- time_base = &stream-> time_base ;
158+ metaData = DiscoverMetaData () ;
129159 }
130160
131161 // push the frame to the next stage.
132162 // The time_base is filled in in the codecContext after the first frame is decoded
133163 // so we can fetch it from there.
134- output->WriteFrame (frame, time_base );
164+ output->WriteFrame (frame, metaData );
135165 }
136166 }
137167
0 commit comments