fix compilation with ffmpeg
This commit is contained in:
		@@ -36,7 +36,7 @@ AVDecoder::AVDecoder() :
 | 
				
			|||||||
AVDecoder::~AVDecoder()
 | 
					AVDecoder::~AVDecoder()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if(pCodecCtx) {
 | 
					    if(pCodecCtx) {
 | 
				
			||||||
        avcodec_close(pCodecCtx);
 | 
					        avcodec_free_context(&pCodecCtx);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if(pFormatCtx) {
 | 
					    if(pFormatCtx) {
 | 
				
			||||||
        avformat_close_input(&pFormatCtx);
 | 
					        avformat_close_input(&pFormatCtx);
 | 
				
			||||||
@@ -70,9 +70,17 @@ bool AVDecoder::loadCodec(codec_type codec)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    av_stream = pFormatCtx->streams[stream_index];
 | 
					    av_stream = pFormatCtx->streams[stream_index];
 | 
				
			||||||
    pCodecCtx = av_stream->codec;
 | 
					    pCodecCtx = avcodec_alloc_context3(av_codec);
 | 
				
			||||||
 | 
					    if (!pCodecCtx) {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (avcodec_parameters_to_context(pCodecCtx, av_stream->codecpar) < 0) {
 | 
				
			||||||
 | 
					        avcodec_free_context(&pCodecCtx);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(avcodec_open2(pCodecCtx, av_codec, &opts) < 0) {
 | 
					    if(avcodec_open2(pCodecCtx, av_codec, &opts) < 0) {
 | 
				
			||||||
 | 
					        avcodec_free_context(&pCodecCtx);
 | 
				
			||||||
        codec_loaded = false;
 | 
					        codec_loaded = false;
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -129,24 +137,35 @@ void AVDecoder::getVideoMetadata(metadata_t &metadata)
 | 
				
			|||||||
AVFrame *AVDecoder::getDecodedFrame(AVCodecContext *codec_ctx, int frame_stream_index)
 | 
					AVFrame *AVDecoder::getDecodedFrame(AVCodecContext *codec_ctx, int frame_stream_index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    AVFrame *pFrame = av_frame_alloc();
 | 
					    AVFrame *pFrame = av_frame_alloc();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    AVPacket packet;
 | 
					    AVPacket packet;
 | 
				
			||||||
    int frame_finished = 0;
 | 
					    int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while(!frame_finished && av_read_frame(pFormatCtx, &packet)>=0) {
 | 
					    while (av_read_frame(pFormatCtx, &packet) >= 0) {
 | 
				
			||||||
        if (packet.stream_index == frame_stream_index) {
 | 
					        if (packet.stream_index == frame_stream_index) {
 | 
				
			||||||
            avcodec_decode_video2(codec_ctx, pFrame, &frame_finished, &packet);
 | 
					            ret = avcodec_send_packet(codec_ctx, &packet);
 | 
				
			||||||
 | 
					            av_packet_unref(&packet);
 | 
				
			||||||
 | 
					            if (ret < 0) {
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            ret = avcodec_receive_frame(codec_ctx, pFrame);
 | 
				
			||||||
 | 
					            if (ret == 0) {
 | 
				
			||||||
 | 
					                // Frame successfully decoded
 | 
				
			||||||
 | 
					                return pFrame;
 | 
				
			||||||
 | 
					            } else if (ret == AVERROR(EAGAIN)) {
 | 
				
			||||||
 | 
					                // Need more packets
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // Error or end of stream
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
            av_packet_unref(&packet);
 | 
					            av_packet_unref(&packet);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(frame_finished) {
 | 
					 | 
				
			||||||
        return pFrame;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
    av_frame_free(&pFrame);
 | 
					    av_frame_free(&pFrame);
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool AVDecoder::seekVideo(int percentage)
 | 
					bool AVDecoder::seekVideo(int percentage)
 | 
				
			||||||
@@ -211,8 +230,8 @@ QByteArray AVDecoder::getThumbnail(int &width, int &height)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
QByteArray AVDecoder::WriteJPEG(AVCodecContext *pCodecCtx, AVFrame *pFrame, int width, int height)
 | 
					QByteArray AVDecoder::WriteJPEG(AVCodecContext *pCodecCtx, AVFrame *pFrame, int width, int height)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    AVCodecContext *pOCodecCtx;
 | 
					    AVCodecContext *pOCodecCtx = nullptr;
 | 
				
			||||||
    AVCodec        *pOCodec;
 | 
					    const AVCodec  *pOCodec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QByteArray data;
 | 
					    QByteArray data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -265,11 +284,10 @@ QByteArray AVDecoder::WriteJPEG(AVCodecContext *pCodecCtx, AVFrame *pFrame, int
 | 
				
			|||||||
    pOCodecCtx = avcodec_alloc_context3(pOCodec);
 | 
					    pOCodecCtx = avcodec_alloc_context3(pOCodec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(pOCodecCtx == NULL) {
 | 
					    if(pOCodecCtx == NULL) {
 | 
				
			||||||
        avcodec_free_context(&pOCodecCtx);
 | 
					 | 
				
			||||||
        av_free(buffer);
 | 
					        av_free(buffer);
 | 
				
			||||||
        av_frame_free(&pFrameRGB);
 | 
					        av_frame_free(&pFrameRGB);
 | 
				
			||||||
        sws_freeContext(sws_ctx);
 | 
					        sws_freeContext(sws_ctx);
 | 
				
			||||||
        return  0;
 | 
					        return data;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pOCodecCtx->bit_rate      = pCodecCtx->bit_rate;
 | 
					    pOCodecCtx->bit_rate      = pCodecCtx->bit_rate;
 | 
				
			||||||
@@ -288,7 +306,7 @@ QByteArray AVDecoder::WriteJPEG(AVCodecContext *pCodecCtx, AVFrame *pFrame, int
 | 
				
			|||||||
        av_free(buffer);
 | 
					        av_free(buffer);
 | 
				
			||||||
        av_frame_free(&pFrameRGB);
 | 
					        av_frame_free(&pFrameRGB);
 | 
				
			||||||
        sws_freeContext(sws_ctx);
 | 
					        sws_freeContext(sws_ctx);
 | 
				
			||||||
         return  0;
 | 
					        return data;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    av_opt_set_int(pOCodecCtx, "lmin", pOCodecCtx->qmin * FF_QP2LAMBDA, 0);
 | 
					    av_opt_set_int(pOCodecCtx, "lmin", pOCodecCtx->qmin * FF_QP2LAMBDA, 0);
 | 
				
			||||||
@@ -299,27 +317,40 @@ QByteArray AVDecoder::WriteJPEG(AVCodecContext *pCodecCtx, AVFrame *pFrame, int
 | 
				
			|||||||
    pOCodecCtx->flags          = AV_CODEC_FLAG_QSCALE;
 | 
					    pOCodecCtx->flags          = AV_CODEC_FLAG_QSCALE;
 | 
				
			||||||
    pOCodecCtx->global_quality = pOCodecCtx->qmin * FF_QP2LAMBDA;
 | 
					    pOCodecCtx->global_quality = pOCodecCtx->qmin * FF_QP2LAMBDA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pFrame->pts     = 1;
 | 
					    pFrameRGB->pts     = 1;
 | 
				
			||||||
    pFrame->quality = pOCodecCtx->global_quality;
 | 
					    pFrameRGB->quality = pOCodecCtx->global_quality;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    AVPacket pkt;
 | 
					 | 
				
			||||||
    av_init_packet(&pkt);
 | 
					 | 
				
			||||||
    pkt.data = NULL;
 | 
					 | 
				
			||||||
    pkt.size = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int gotPacket;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    avcodec_encode_video2(pOCodecCtx, &pkt, pFrameRGB, &gotPacket);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QByteArray buffer2(reinterpret_cast<char *>(pkt.data), pkt.size);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    AVPacket* pkt = av_packet_alloc();
 | 
				
			||||||
 | 
					    if (!pkt) {
 | 
				
			||||||
 | 
					        avcodec_free_context(&pOCodecCtx);
 | 
				
			||||||
 | 
					        av_free(buffer);
 | 
				
			||||||
 | 
					        av_frame_free(&pFrameRGB);
 | 
				
			||||||
 | 
					        sws_freeContext(sws_ctx);
 | 
				
			||||||
 | 
					        return data;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int ret = avcodec_send_frame(pOCodecCtx, pFrameRGB);
 | 
				
			||||||
 | 
					    if (ret < 0) {
 | 
				
			||||||
 | 
					        av_packet_free(&pkt);
 | 
				
			||||||
 | 
					        avcodec_free_context(&pOCodecCtx);
 | 
				
			||||||
 | 
					        av_free(buffer);
 | 
				
			||||||
 | 
					        av_frame_free(&pFrameRGB);
 | 
				
			||||||
 | 
					        sws_freeContext(sws_ctx);
 | 
				
			||||||
 | 
					        return data;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = avcodec_receive_packet(pOCodecCtx, pkt);
 | 
				
			||||||
 | 
					    if (ret == 0) {
 | 
				
			||||||
 | 
					        data = QByteArray(reinterpret_cast<char *>(pkt->data), pkt->size);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    av_packet_free(&pkt);
 | 
				
			||||||
    avcodec_free_context(&pOCodecCtx);
 | 
					    avcodec_free_context(&pOCodecCtx);
 | 
				
			||||||
    av_free(buffer);
 | 
					    av_free(buffer);
 | 
				
			||||||
    av_frame_free(&pFrameRGB);
 | 
					    av_frame_free(&pFrameRGB);
 | 
				
			||||||
    avcodec_close(pOCodecCtx);
 | 
					 | 
				
			||||||
    sws_freeContext(sws_ctx);
 | 
					    sws_freeContext(sws_ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return buffer2;
 | 
					    return data;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void AVDecoder::close()
 | 
					void AVDecoder::close()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user