16 #ifndef OPENSHOT_FFMPEG_READER_H
17 #define OPENSHOT_FFMPEG_READER_H
107 AVFormatContext *pFormatCtx;
108 int videoStream, audioStream;
109 AVCodecContext *pCodecCtx, *aCodecCtx;
111 AVBufferRef *hw_device_ctx = NULL;
113 AVStream *pStream, *aStream;
117 bool is_duration_known;
118 bool check_interlace;
130 std::shared_ptr<openshot::Frame> last_video_frame;
131 std::shared_ptr<openshot::Frame> last_final_video_frame;
135 int64_t seeking_frame;
138 int64_t seek_audio_frame_found;
139 int64_t seek_video_frame_found;
140 int64_t last_seek_max_frame;
141 int seek_stagnant_count;
144 int64_t largest_frame_processed;
145 int64_t current_video_frame;
150 double pts_offset_seconds;
151 double audio_pts_seconds;
152 double video_pts_seconds;
153 int64_t NO_PTS_OFFSET;
157 double video_stream_duration_seconds = 0.0;
158 double audio_stream_duration_seconds = 0.0;
159 double format_duration_seconds = 0.0;
160 double inferred_duration_seconds = 0.0;
161 int source_width = 0;
162 int source_height = 0;
163 double source_rotation = 0.0;
166 SwsContext *img_convert_ctx =
nullptr;
168 AVFrame *pFrameRGB_cached =
nullptr;
170 int hw_de_supported = 0;
171 bool force_sw_decode =
false;
172 bool hw_decode_failed =
false;
173 int hw_decode_error_count = 0;
174 bool hw_decode_succeeded =
false;
176 AVPixelFormat hw_de_av_pix_fmt = AV_PIX_FMT_NONE;
177 AVHWDeviceType hw_de_av_device_type = AV_HWDEVICE_TYPE_NONE;
178 int IsHardwareDecodeSupported(
int codecid);
188 void CheckWorkingFrames(int64_t requested_frame);
191 int64_t ConvertFrameToAudioPTS(int64_t frame_number);
194 int64_t ConvertFrameToVideoPTS(int64_t frame_number);
197 int64_t ConvertVideoPTStoFrame(int64_t pts);
200 std::shared_ptr<openshot::Frame> CreateFrame(int64_t requested_frame);
209 bool ReopenWithoutHardwareDecode(int64_t requested_frame);
215 int64_t GetPacketPTS();
221 double PickDurationSeconds()
const;
224 void ApplyDurationStrategy();
227 bool IsPartialFrame(int64_t requested_frame);
230 void ProcessVideoPacket(int64_t requested_frame);
233 void ProcessAudioPacket(int64_t requested_frame);
236 std::shared_ptr<openshot::Frame> ReadStream(int64_t requested_frame);
239 void RemoveAVFrame(AVFrame *);
242 void RemoveAVPacket(AVPacket *);
245 void Seek(int64_t requested_frame);
250 void UpdatePTSOffset();
253 void UpdateAudioInfo();
256 void UpdateVideoInfo();
259 void UpdateOrientedVideoInfo();
262 void ApplyFrameOrientation(std::shared_ptr<openshot::Frame> frame);
278 FFmpegReader(
const std::string& path,
bool inspect_reader=
true);
290 void Close()
override;
299 std::shared_ptr<openshot::Frame>
GetFrame(int64_t requested_frame)
override;
302 bool IsOpen()
override {
return is_open; };
308 std::string
Name()
override {
return "FFmpegReader"; };
311 std::string
Json()
const override;
312 void SetJson(
const std::string value)
override;
317 void Open()
override;