[Libav-user] swscaler bad src image pointers, can not figure out why.

Richard Hussong rhussong at westpond.com
Mon Sep 23 23:03:53 EEST 2019


On Sun, Sep 15, 2019 at 9:17 PM Dorian Green <doriangreen97 at 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 at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20190923/940710d9/attachment.html>


More information about the Libav-user mailing list