Just another note, you don't have to create a conversion context for every
frame.  you can create one conversion context and use it over and over again
(Just make sure your create it globally so that it stays in scope), that
would make you code more efficient instead of creating a new context for
every frame.

-Glen


On Tue, Aug 3, 2010 at 12:32 PM, Glen Ruedinger <[email protected]>wrote:

> 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

Reply via email to