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

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Dorian Green
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. 

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
[hidden email]
https://ffmpeg.org/mailman/listinfo/libav-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".
Reply | Threaded
Open this post in threaded view
|

Re: swscaler bad src image pointers, can not figure out why.

Richard Hussong


On Sun, Sep 15, 2019 at 9:17 PM Dorian Green <[hidden email]> 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
[hidden email]
https://ffmpeg.org/mailman/listinfo/libav-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".

_______________________________________________
Libav-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/libav-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".