On Sun, Sep 15, 2019 at 9:17 PM Dorian Green <doriangree...@gmail.com> wrote:
> hello, I am trying to become more adept at using the libav libraries and have > > practising them. The problem I am having is that swscale at the bottom of my > > code listed here always returns bad src image pointers. this below is the main > > chuck of my learning test code. > > I see that you are not checking the return code from avcodec_receive_frame. With some codecs, it is possible that a call to avcodec_send_packet will not actually return a frame. If the return_value is AVERROR(EAGAIN), that is not an error, but it means you will need to send more packets before a frame is ready. You should really only process the frame if return_value is 0. > > format_context = avformat_alloc_context(); > > if(!format_context){ > std::cout << "failed to allocate memory for AVFormatContext " << filename > << std::endl; > return 0; > }else{ > std::cout << "allocated memory for AVFormatContext " << filename << " > successfully" << std::endl; > } > > if(avformat_open_input(&format_context,filename,nullptr,nullptr) != 0){ > std::cout << " could not open the file" << std::endl; > return 0; > }else{ > std::cout << "opened file successfully" << std::endl; > } > > if(avformat_find_stream_info(format_context, nullptr) < 0){ > std::cout << "could not get stream info" << std::endl; > return 0; > } > > av_dump_format(format_context,0,filename, 0); > > video_stream_index = av_find_best_stream( > format_context, > AVMEDIA_TYPE_VIDEO, > -1, > -1, > &av_video_codec_decoder, > 0 > ); > > if(video_stream_index == AVERROR_STREAM_NOT_FOUND || !av_video_codec_decoder){ > std::cout << "video stream not found." << std::endl; > return 0; > }else{ > std::cout << "video stream found successfully." << std::endl; > } > > audio_stream_index = av_find_best_stream( > format_context, > AVMEDIA_TYPE_AUDIO, > -1, > -1, > &av_audio_codec_decoder, > 0 > ); > > if(audio_stream_index == AVERROR_STREAM_NOT_FOUND || !av_audio_codec_decoder){ > std::cout << "audio stream not found." << std::endl; > return 0; > }else{ > std::cout << "audio stream found successfully." << std::endl; > } > > codec_context = avcodec_alloc_context3(av_video_codec_decoder); > > if(!codec_context){ > std::cout << std::endl << "failed to allocate memory for AVCodecContext" > << std::endl; > return 0; > }else{ > std::cout << std::endl << "allocated memory for AVCodecContext" << > std::endl; > } > > if(avcodec_parameters_to_context(codec_context, > format_context->streams[video_stream_index]->codecpar) < 0){ > std::cout << "Failed to set parameters." << std::endl; > return 0; > }else{ > std::cout << "parameters set successfully." << std::endl; > } > > if (avcodec_open2(codec_context, av_video_codec_decoder, nullptr) < 0) { > std::cout << "Could not open codec." << std::endl; > return -1; > }else{ > std::cout << "Codec opened successfully" << std::endl; > } > > if(codec_context-> height == 0 || codec_context->width == 0){ > std::cout << "something went wrong. codec_context height or width of 0 > detected" << std::endl; > return 0; > }else{ > std::cout << "codec_context appears correct.." << std::endl; > } > > secondary_av_frame = av_frame_alloc(); > > if(!secondary_av_frame){ > std::cout << "failed to allocate memory for secondary_av_frame > (AVFrame)." << std::endl; > return 0; > }else{ > std::cout << "allocated memory for secondary_av_frame (AVFrame)" << > std::endl; > } > > primary_av_frame = av_frame_alloc(); > > if(!primary_av_frame){ > std::cout << "failed to allocate memory for primary_av_frame (AVFrame)." > << std::endl; > return 0; > }else{ > std::cout << "allocated memory for primary_av_frame (AVFrame)" << > std::endl; > } > > primary_av_frame->format = codec_context->pix_fmt; > primary_av_frame->width = codec_context->width; > primary_av_frame->height = codec_context->height; > > int ret = av_frame_get_buffer(primary_av_frame, 0); > > if(ret < 0){ > std::cout << "failed av_frame_get_buffer" << std::endl; > return 0; > }else{ > std::cout << "av_frame_get_buffer successful" << std::endl; > } > > buffer_size = av_image_get_buffer_size( > codec_context->pix_fmt, > codec_context->width, > codec_context->height, > 1); > > if(!buffer_size){ > std::cout << "failed to allocate buffer_size (size_t)" << std::endl; > return 0; > }else{ > std::cout << "allocated memory for buffer_size (size_t)" << std::endl; > } > > sws_context = sws_getContext(codec_context->width, codec_context->height, > codec_context->pix_fmt, > codec_context->width, codec_context->height, > AV_PIX_FMT_RGB24, SWS_BICUBIC, nullptr, nullptr, > nullptr); > > if(sws_context){ > std::cout << "allocated sws_context" << std::endl; > } > > while(av_read_frame(format_context, primary_packet) >=0 ) { > glClear(GL_COLOR_BUFFER_BIT); > std::cout << "video current framecount: " + std::to_string(++framecount) > << std::endl; > > if (primary_packet->stream_index == video_stream_index) { > > return_value = avcodec_send_packet(codec_context, primary_packet); > > if (return_value != 0) { > > if (return_value == AVERROR_EOF) { > end_of_file = true; > std::cout << "end of file: the decoder has been flushed. > (this can also mean more than one flush packet.)" << std::endl; > } else if (return_value == AVERROR(EINVAL)) { > std::cout << "codec not opened or requires flush" << > std::endl; > } else if (return_value == AVERROR(ENOMEM)) { > std::cout << "failed to add packet to internal queue, or > similar" << std::endl; > } else { > std::cout << "Unexpected Error: " + > std::to_string(return_value) << std::endl; > } > > } else { > std::cout << "packet sent successfully" << std::endl; > > return_value = avcodec_receive_frame(codec_context, > primary_av_frame) > > sws_scale(sws_context, > primary_av_frame->data, > primary_av_frame->linesize, > 0, > codec_context->height, > primary_display_frame->data, > primary_display_frame->linesize); > > sws_freeContext(sws_context); > > _______________________________________________ > Libav-user mailing list > Libav-user@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/libav-user > > To unsubscribe, visit link above, or email > libav-user-requ...@ffmpeg.org with subject "unsubscribe".
_______________________________________________ Libav-user mailing list Libav-user@ffmpeg.org https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email libav-user-requ...@ffmpeg.org with subject "unsubscribe".