diff --git a/src/AvTranscoder/encoder/AudioEncoder.cpp b/src/AvTranscoder/encoder/AudioEncoder.cpp index afede6e4..0e615466 100644 --- a/src/AvTranscoder/encoder/AudioEncoder.cpp +++ b/src/AvTranscoder/encoder/AudioEncoder.cpp @@ -96,8 +96,6 @@ bool AudioEncoder::encodeFrame(const Frame& sourceFrame, CodedData& codedFrame) AVCodecContext& avCodecContext = _codec.getAVCodecContext(); AVPacket& packet = codedFrame.getAVPacket(); - packet.stream_index = 0; - if((avCodecContext.coded_frame) && (avCodecContext.coded_frame->pts != (int)AV_NOPTS_VALUE)) { packet.pts = avCodecContext.coded_frame->pts; @@ -108,55 +106,38 @@ bool AudioEncoder::encodeFrame(const Frame& sourceFrame, CodedData& codedFrame) packet.flags |= AV_PKT_FLAG_KEY; } -#if LIBAVCODEC_VERSION_MAJOR > 53 - int gotPacket = 0; - int ret = avcodec_encode_audio2(&avCodecContext, &packet, &sourceFrame.getAVFrame(), &gotPacket); - if(ret != 0 && gotPacket == 0) - { - throw std::runtime_error("Encode audio frame error: avcodec encode audio frame - " + - getDescriptionFromErrorCode(ret)); - } -#else - int ret = avcodec_encode_audio(&avCodecContext, packet.data, packet.size, &sourceFrame.getAVFrame()); - if(ret < 0) - { - throw std::runtime_error("Encode audio frame error: avcodec encode audio frame - " + - getDescriptionFromErrorCode(ret)); - } -#endif - -#if LIBAVCODEC_VERSION_MAJOR > 53 - return ret == 0 && gotPacket == 1; -#endif - return ret == 0; + return encode(&sourceFrame.getAVFrame(), packet); } bool AudioEncoder::encodeFrame(CodedData& codedFrame) { - AVCodecContext& avCodecContext = _codec.getAVCodecContext(); + return encode(NULL, codedFrame.getAVPacket()); +} - AVPacket& packet = codedFrame.getAVPacket(); - packet.stream_index = 0; +bool AudioEncoder::encode(const AVFrame* decodedData, AVPacket& encodedData) +{ + // Be sure that data of AVPacket is NULL so that the encoder will allocate it + encodedData.data = NULL; + AVCodecContext& avCodecContext = _codec.getAVCodecContext(); #if LIBAVCODEC_VERSION_MAJOR > 53 int gotPacket = 0; - int ret = avcodec_encode_audio2(&avCodecContext, &packet, NULL, &gotPacket); - if(ret != 0 && gotPacket == 0) + const int ret = avcodec_encode_audio2(&avCodecContext, &encodedData, decodedData, &gotPacket); + if(ret != 0) { - throw std::runtime_error("Encode audio frame error: avcodec encode last audio frame - " + + throw std::runtime_error("Encode audio frame error: avcodec encode audio frame - " + getDescriptionFromErrorCode(ret)); } - return ret == 0 && gotPacket == 1; - + return gotPacket == 1; #else - int ret = avcodec_encode_audio(&avCodecContext, packet.data, packet.size, NULL); + const int ret = avcodec_encode_audio(&avCodecContext, encodedData.data, encodedData.size, decodedData); if(ret < 0) { - throw std::runtime_error("Encode audio frame error: avcodec encode last audio frame - " + + throw std::runtime_error("Encode audio frame error: avcodec encode audio frame - " + getDescriptionFromErrorCode(ret)); } - return ret == 0; - + return true; #endif } + } diff --git a/src/AvTranscoder/encoder/AudioEncoder.hpp b/src/AvTranscoder/encoder/AudioEncoder.hpp index 149fb8f6..35ea2bef 100644 --- a/src/AvTranscoder/encoder/AudioEncoder.hpp +++ b/src/AvTranscoder/encoder/AudioEncoder.hpp @@ -24,6 +24,9 @@ class AvExport AudioEncoder : public IEncoder ICodec& getCodec() { return _codec; } AudioCodec& getAudioCodec() { return _codec; } +private: + bool encode(const AVFrame* decodedData, AVPacket& encodedData); + private: AudioCodec _codec; }; diff --git a/src/AvTranscoder/encoder/IEncoder.hpp b/src/AvTranscoder/encoder/IEncoder.hpp index 1ba57a74..33ef1f38 100644 --- a/src/AvTranscoder/encoder/IEncoder.hpp +++ b/src/AvTranscoder/encoder/IEncoder.hpp @@ -23,16 +23,18 @@ class AvExport IEncoder /** * @brief Encode a new frame, and get coded frame - * @param sourceFrame frame need to be encoded - * @param codedFrame data of the coded frame if present (first frames can be delayed) + * @param sourceFrame: frame that needs to be encoded + * @param codedFrame: output encoded coded data (first frames can be delayed) * @return status of encoding + * @throw runtime_error if the encoded process failed. */ virtual bool encodeFrame(const Frame& sourceFrame, CodedData& codedFrame) = 0; /** - * @brief Get delayed encoded frames - * @param codedFrame data of the coded frame if present (first frames can be delayed) + * @brief Get the frames remaining into the encoder + * @param codedFrame: output encoded data * @return status of encoding + * @throw runtime_error if the encoded process failed. */ virtual bool encodeFrame(CodedData& codedFrame) = 0; diff --git a/src/AvTranscoder/encoder/VideoEncoder.cpp b/src/AvTranscoder/encoder/VideoEncoder.cpp index dc6e2973..a4dd7424 100644 --- a/src/AvTranscoder/encoder/VideoEncoder.cpp +++ b/src/AvTranscoder/encoder/VideoEncoder.cpp @@ -109,8 +109,6 @@ bool VideoEncoder::encodeFrame(const Frame& sourceFrame, CodedData& codedFrame) AVCodecContext& avCodecContext = _codec.getAVCodecContext(); AVPacket& packet = codedFrame.getAVPacket(); - packet.stream_index = 0; - if((avCodecContext.coded_frame) && (avCodecContext.coded_frame->pts != (int)AV_NOPTS_VALUE)) { packet.pts = avCodecContext.coded_frame->pts; @@ -121,53 +119,38 @@ bool VideoEncoder::encodeFrame(const Frame& sourceFrame, CodedData& codedFrame) packet.flags |= AV_PKT_FLAG_KEY; } -#if LIBAVCODEC_VERSION_MAJOR > 53 - int gotPacket = 0; - int ret = avcodec_encode_video2(&avCodecContext, &packet, &sourceFrame.getAVFrame(), &gotPacket); - if(ret != 0 && gotPacket == 0) - { - throw std::runtime_error("Encode video frame error: avcodec encode video frame - " + - getDescriptionFromErrorCode(ret)); - } -#else - int ret = avcodec_encode_video(&avCodecContext, packet.data, packet.size, &sourceFrame.getAVFrame()); - if(ret < 0) - { - throw std::runtime_error("Encode video frame error: avcodec encode video frame - " + - getDescriptionFromErrorCode(ret)); - } -#endif - -#if LIBAVCODEC_VERSION_MAJOR > 53 - return ret == 0 && gotPacket == 1; -#endif - return ret == 0; + return encode(&sourceFrame.getAVFrame(), packet); } bool VideoEncoder::encodeFrame(CodedData& codedFrame) { - AVCodecContext& avCodecContext = _codec.getAVCodecContext(); + return encode(NULL, codedFrame.getAVPacket()); +} - AVPacket& packet = codedFrame.getAVPacket(); - packet.stream_index = 0; +bool VideoEncoder::encode(const AVFrame* decodedData, AVPacket& encodedData) +{ + // Be sure that data of AVPacket is NULL so that the encoder will allocate it + encodedData.data = NULL; + AVCodecContext& avCodecContext = _codec.getAVCodecContext(); #if LIBAVCODEC_VERSION_MAJOR > 53 int gotPacket = 0; - int ret = avcodec_encode_video2(&avCodecContext, &packet, NULL, &gotPacket); - if(ret != 0 && gotPacket == 0) + const int ret = avcodec_encode_video2(&avCodecContext, &encodedData, decodedData, &gotPacket); + if(ret != 0) { - throw std::runtime_error("Encode video frame error: avcodec encode last video frame - " + + throw std::runtime_error("Encode video frame error: avcodec encode video frame - " + getDescriptionFromErrorCode(ret)); } - return ret == 0 && gotPacket == 1; + return gotPacket == 1; #else - int ret = avcodec_encode_video(&avCodecContext, packet.data, packet.size, NULL); + const int ret = avcodec_encode_video(&avCodecContext, encodedData.data, encodedData.size, decodedData); if(ret < 0) { - throw std::runtime_error("Encode video frame error: avcodec encode last video frame - " + + throw std::runtime_error("Encode video frame error: avcodec encode video frame - " + getDescriptionFromErrorCode(ret)); } - return ret == 0; + return true; #endif } + } diff --git a/src/AvTranscoder/encoder/VideoEncoder.hpp b/src/AvTranscoder/encoder/VideoEncoder.hpp index 05d513ce..0a45b7e8 100644 --- a/src/AvTranscoder/encoder/VideoEncoder.hpp +++ b/src/AvTranscoder/encoder/VideoEncoder.hpp @@ -24,6 +24,9 @@ class AvExport VideoEncoder : public IEncoder ICodec& getCodec() { return _codec; } VideoCodec& getVideoCodec() { return _codec; } +private: + bool encode(const AVFrame* decodedData, AVPacket& encodedData); + private: VideoCodec _codec; };