Hi All,I am using libswscale to do some YUV - RGB conversion back and forth. There are 2 steps performed on an image.
1. RGB - YUV conversion 2. YUV - RGB conversionIssue is that in the image output from step 2, the right edge of the image is missing, means the pixels are black. The rest of the image seems ok compared to original image. This black edge is roughly 5-10 pixels wide and varies depending on the size of the image. This issue happens for images with certain dimensions. For some images this issue does not appear. So I guess this is due to libswscale issue or the way i'm using it is wrong. Also I get a libswscale warning on this conversion.
[swscaler @ 0x1768020] Warning: data is not aligned! This can lead to a speedloss
If I analyze the Y values along the right edge, I can see that they have valid values, so I deduce this is an issue arising from step 2 (YUV to RGB). My code (truncated for clarity) looks like follows for each step.
Step 1. RGB- YUV conversion.----------------------------
// Create YUV buffer
m_bufferSize = avpicture_get_size(PIX_FMT_YUV420P, width, height);
avPictureInfo_ = avcodec_alloc_frame();
m_buffer = (uint8_t *)av_malloc(m_bufferSize);
avpicture_fill((AVPicture*)avPictureInfo_, m_buffer, PIX_FMT_YUV420P,
width, height);
// Then fill it with RGB data
struct SwsContext *img_convert_ctx = sws_getContext(m_width, m_height,
PIX_FMT_RGB24,
m_width,
m_height, PIX_FMT_YUV420P, SWS_BICUBIC,
NULL, NULL, NULL);
if (img_convert_ctx == NULL) {
return NULL;
}
uint8_t * srcData[4] = {m_buffer, 0, 0, 0};
int srcLineSize[4] = {m_width * 3 * sizeof(uint8_t), 0, 0, 0};
sws_scale(img_convert_ctx, srcData, srcLineSize, 0,
m_height, yuvImage->avPictureInfo_->data,
yuvImage->avPictureInfo_->linesize);
free(img_convert_ctx);
Step 2: YUV - RGB conversion
--------------------------------------------------
m_bufferSize = avpicture_get_size(PIX_FMT_RGB24, width, height);
m_buffer = (uint8_t *)av_malloc(m_bufferSize);
struct SwsContext *img_convert_ctx = sws_getContext(m_width, m_height,
PIX_FMT_YUV420P,
m_width,
m_height, PIX_FMT_RGB24, SWS_BICUBIC,
NULL, NULL, NULL);
if (img_convert_ctx == NULL) {
return NULL;
}
AVFrame * rgbPictInfo = avcodec_alloc_frame();
avpicture_fill((AVPicture*)rgbPictInfo, rgbImage->m_buffer,
PIX_FMT_RGB24,
m_width, m_height);
sws_scale(img_convert_ctx, avPictureInfo_->data,
avPictureInfo_->linesize, 0,
m_height, rgbPictInfo->data, rgbPictInfo->linesize);
-----------------------------------------------
I am using libav functions to allocate memory etc, so they should take
care of alignment. So why does libswscale complain about not aligned
data? Why are pixels missing along in the right edge of the image? I'm
also attaching two images from step 1 and 2.
Please help! -Sampath
<<attachment: ref.ppm>>
<<attachment: ref-yuv.ppm>>
_______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
