/* * Copyright (c) 2023 Fancy Code. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FFMPEG_ENCODER_H #define FFMPEG_ENCODER_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus } #endif #include class FfmpegEncoder { public: FfmpegEncoder(const enum AVCodecID &codecId); virtual ~FfmpegEncoder() = default; bool Init(int &outputFlags); void UnInit(void); AVRational GetTimeBase(void); bool OpenEncoder(AVDictionary *optArg, AVStream *stream); int EncodeData(AVFrame *frame, AVStream *stream, std::function callback); private: bool OpenVideo(AVDictionary *optArg, AVStream *stream); bool OpenAudio(AVDictionary *optArg, AVStream *stream); AVFrame *ConvertAudioFrame(AVFrame *decodeFrame, struct SwrContext *swr_ctx); private: static AVFrame *alloc_frame(enum AVPixelFormat pix_fmt, int width, int height); static AVFrame *alloc_audio_frame(enum AVSampleFormat sample_fmt, const AVChannelLayout *channel_layout, int sample_rate, int nb_samples); private: const enum AVCodecID mCodecId; AVCodecContext *mCodecCtx; AVCodec *mCodec; AVFrame *mFrame; AVFrame *mTmpFrame; AVPacket *mTmpPkt; int mSamplesCount; struct SwrContext *mSwrCtx; int64_t next_pts; }; #endif