[Libav-user] Yet another noob converting rgb24 to yuv420
Joshua Kordani
jkordani at lsa2.com
Tue Sep 17 06:32:17 CEST 2013
Greetings all,
This must be asked a million times, but I am trying to take rgb24
and convert it to yuv420 for use with x264. My code is failing on the
sws_scale call with a bad access, inside ff_yuv2plane1_8_avx.loop_a,
which suggests to me that I haven't given it the input data structures
in the right way. I'm starting with packed data, that is, rgb pixel
values every 24 bits, but it looks like the sws_scale call is
generalized to assume that input and output data is planar, and that (I
imagine) if the input (or output) is supposed to be non-planar, that it
should be stored/can be found in the first plane of the relevant data
structures
Since x264 seems to provide for a data structure that fits this
purpose (the img struct inside of a pic_t, properly initialized), I've
used it as my dst and dstStride locations
My code looks like this.
//the compiler complained that it couldn't locate these when I tried to
call them directly in the getCachedContext call. This is the result of
a few rounds of debugging
enum AVPixelFormat src_pix_fmt = AV_PIX_FMT_RGB24, dst_pix_fmt =
AV_PIX_FMT_YUV420P;
scale_context = sws_getCachedContext(scale_context,
frame_width,
frame_height,
src_pix_fmt,
frame_width,
frame_height,
dst_pix_fmt,
SWS_BICUBIC,
NULL,
NULL,
NULL
);
//where frame_width, frame_height is the size in pixels of my input
frame (right?)
...snip...
sws_scale(scale_context,
&frame,
&rowstride,
0,
x264_params->i_height,
pic_in.img.plane,
pic_in.img.i_stride
);
where frame is a pointer to my packed data, so I pass in a reference to
the pointer (so that, assuming that the input pixel format specifier
assumes packed data, and that the packed data is in the [0] offset of
the pointer provided to the function....) right?,
rowstride is 3 * frame_width stored in a local, same problem, the
function call is expecting a pointer or reference to de-reference, but
since this is packed data there is only one stride, right?
pic_in is a struct from the x264 library, with a convenient sub
structure img, which seems to be purpose built for this kind of function
(or vice versa), where i_stride is an array of strides, plane an array
of planes, i_height was a convenient place for me to retrieve this value.
I have a feeling I'm abusing lots of things, I was trying to avoid doing
this and using x264 support for encoding rgb directly, but apparently it
was too bleeding edge and decoding it was becoming a problem. I thought
the plan b wouldn't be too hard to implement but I just don't seem to be
understanding how to setup and use this code.
I'm starting from a codebase that did compile and run, attempting to
encode the rgb directly. I couldn't find a decoder that was able to
decode what I was producing, it seemed to be related to the colorspace I
was trying to decode to, so it became more apparent that I needed to do
a conversion.
I would appreciate any pointers anyone may have. I'm not afraid of
reading, I just haven't been able to leverage the things I've found so far.
--
Joshua Kordani
LSA Autonomy
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130917/7671dbe2/attachment.html>
More information about the Libav-user
mailing list