Just to clarify, if you don't scale the video frames, do they display correctly?
Is our problem just the scaling? On Tue, Aug 3, 2010 at 5:50 AM, Candice Seenyen <[email protected]>wrote: > HI Glen, > > It seems I have been able to fix the sws_scale problem. I have added > avpicture_fill and it no longer crashes even with srcSlice set to 0. > However, I still get only a green screen. Do you have any idea what could > be > wrong with the code that I only have this result? I have attached a picture > of the screen I get if you can access it, and my code is as below. Could > the > problem be outside of ffmpeg but in the implementation of opal libraries? > > Thank you so much for your help! > > Candice > > > PBoolean PVideoInputDevice_IPCamera::GetFrameDataNoDelay(BYTE *destFrame, > PINDEX * bytesReturned) > { > int frame_finished; > struct SwsContext *img_convert_ctx; > av_init_packet(&pckt); > > m_grabCount++; > > if (!is_open) > return PFalse; > > uint8_t *buffer; // Create buffer to hold picture > int numBytes; > // Determine required buffer size and allocate buffer > numBytes = avpicture_get_size(PIX_FMT_YUV420P, > ip_codec_context->width, ip_codec_context->height); > buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t)); > > // Assign appropriate parts of buffer to image planes in pFrameRGB > avpicture_fill((AVPicture *)scaled_ip_frame, buffer, > PIX_FMT_YUV420P, > ip_codec_context->width, ip_codec_context->height); > > int x = av_read_frame(ip_context, &pckt); // Gets the next frame in > the stream > > if(pckt.stream_index == video_stream) > { > int decode = avcodec_decode_video2(ip_codec_context, > raw_ip_frame, &frame_finished, &pckt); > > if(frame_finished) > { > int w = ip_codec_context->width; > int h = ip_codec_context->height; > img_convert_ctx = sws_getContext(w, h, > ip_codec_context->pix_fmt, > w, h, PIX_FMT_YUV420P, SWS_BICUBIC, > NULL, > NULL, NULL); > > if(img_convert_ctx == NULL) > { > return PFalse; > } > > int scaled = sws_scale(img_convert_ctx, > raw_ip_frame->data, raw_ip_frame->linesize, 0, > ip_codec_context->height, > scaled_ip_frame->data, scaled_ip_frame->linesize); > > // Copy the content of the scaled_ip_frame into > the buffer for destination frame > //memcpy(destFrame, scaled_ip_frame, pckt.size); > memcpy(destFrame, buffer, pckt.size); > } > > else > { > PTRACE(1, "frame finished == 0"); > memcpy(destFrame, pckt.data, pckt.size); > } > } > > // Associated with opal functions but converter is always null > for some reason > if (converter == NULL) > { > PTRACE(1, "converter is NULL"); > if (bytesReturned != NULL) > *bytesReturned = ip_frame_size; > } > > else > { > PTRACE(1, "passed if => converter is not null"); > PBoolean y = converter->SetSrcFrameSize(ip_frame_width, > ip_frame_height); > PTRACE(1, "converter set source frame size = " << y); > PTRACE(1, "size of bytesReturnes = " << *bytesReturned); > if (!converter->Convert(buffer, destFrame, > bytesReturned)) > { > PTRACE(1, "problem converting it seems"); > return PFalse; > } > > PTRACE(1, "converting next line"); > > if (bytesReturned != NULL) > { > PTRACE(1, "bytes Returned is not null"); > *bytesReturned = converter->GetMaxDstFrameBytes(); > PTRACE(1, "bytes Returned is not null"); > } > } > > PTRACE(1, "grabCount = " << m_grabCount); > > > av_free(img_convert_ctx); > av_free_packet(&pckt); > //av_free(raw_ip_frame); > //av_free(scaled_ip_frame); > > return PTrue; > } > > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user > > _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
