mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-04-16 11:59:45 -04:00
Switch all owning AVFrame* variables to av_frame_ptr for automatic cleanup. Use AVBufferRef to store frame data in AVFrame where appropriate so that it can be freed automatically with it's AVFrame. Handle allocation errors.
58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
#ifndef ZM_FFMPEG_INPUT_H
|
|
#define ZM_FFMPEG_INPUT_H
|
|
|
|
#include "zm_define.h"
|
|
#include "zm_ffmpeg.h"
|
|
|
|
extern "C" {
|
|
#include <libavformat/avformat.h>
|
|
#include <libavformat/avio.h>
|
|
#include <libavcodec/avcodec.h>
|
|
}
|
|
|
|
class FFmpeg_Input {
|
|
|
|
public:
|
|
FFmpeg_Input();
|
|
~FFmpeg_Input();
|
|
|
|
int Open(const char *filename );
|
|
int Open(
|
|
const AVStream *,
|
|
const AVCodecContext *,
|
|
const AVStream *,
|
|
const AVCodecContext *);
|
|
int Close();
|
|
AVFrame *get_frame(int stream_id=-1);
|
|
AVFrame *get_frame(int stream_id, double at);
|
|
int get_video_stream_id() const {
|
|
return video_stream_id;
|
|
}
|
|
int get_audio_stream_id() const {
|
|
return audio_stream_id;
|
|
}
|
|
AVStream *get_video_stream() {
|
|
return ( video_stream_id >= 0 ) ? input_format_context->streams[video_stream_id] : nullptr;
|
|
}
|
|
AVStream *get_audio_stream() {
|
|
return ( audio_stream_id >= 0 ) ? input_format_context->streams[audio_stream_id] : nullptr;
|
|
}
|
|
AVFormatContext *get_format_context() { return input_format_context; };
|
|
|
|
private:
|
|
typedef struct {
|
|
AVCodecContext *context;
|
|
const AVCodec *codec;
|
|
int frame_count;
|
|
} stream;
|
|
|
|
stream *streams;
|
|
int video_stream_id;
|
|
int audio_stream_id;
|
|
AVFormatContext *input_format_context;
|
|
av_frame_ptr frame;
|
|
int64_t last_seek_request;
|
|
};
|
|
|
|
#endif
|