#ifndef FFCONV_MEDIAFILE_H #define FFCONV_MEDIAFILE_H #include "Stream.h" #include "Packet.h" #include extern "C" { #include } #include #include #ifndef _MSC_VER #include #endif namespace ffcpp { enum class Mode { Read, Write }; class MediaFile { private: AVFormatContext* _formatCtx; Mode _mode; std::vector _streams; public: MediaFile(const std::string& src, Mode mode); operator AVFormatContext*() const; bool hasVideo() const; bool hasAudio() const; StreamPtr videoStream(size_t index = 0); StreamPtr audioStream(size_t index = 0); StreamPtr addVideoStream(AVCodecID codecID, int width, int height, AVRational timeBase, AVPixelFormat pixelFormat = AV_PIX_FMT_NONE); StreamPtr addAudioStream(AVCodecID codecID, int channels, int sampleRate, AVSampleFormat sampleFormat = AV_SAMPLE_FMT_NONE); PacketPtr readPacket(); AVMediaType packetType(const PacketPtr packet); void writeHeader(); void writeTrailer(); void writePacket(Packet& packet); ~MediaFile(); private: bool hasStream(AVMediaType type) const; StreamPtr getStream(AVMediaType type, size_t index); }; } #endif //FFCONV_MEDIAFILE_H