[FFmpeg-devel] [PATCH] Introduce av_fill_image_planesizes() (was: swscale-test: add md5 output)

Ramiro Polla ramiro.polla
Sat Sep 4 18:56:42 CEST 2010


On Thu, Aug 19, 2010 at 6:39 PM, Stefano Sabatini
<stefano.sabatini-lala at poste.it> wrote:
> On date Thursday 2010-08-19 16:16:09 -0300, Ramiro Polla encoded:
>> On Thu, Aug 19, 2010 at 11:52 AM, Ramiro Polla <ramiro.polla at gmail.com> wrote:
>> > On Thu, Aug 19, 2010 at 7:32 AM, Stefano Sabatini
>> > <stefano.sabatini-lala at poste.it> wrote:
>> >> On date Thursday 2010-08-19 00:44:17 -0300, Ramiro Polla encoded:
>> >>> On Tue, Aug 17, 2010 at 9:14 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
>> >>> > On Mon, Aug 16, 2010 at 05:09:35PM -0300, Ramiro Polla wrote:
>> >>> BTW we're currently allocating stride*height for all planes, it'd be
>> >>> nice if there was a function that could give back the result of the
>> >>> size[] calculation from av_fill_image_pointers() (Stefano might want
>> >>> to do this =).
>> >>
>> >> You can use av_fill_image_pointers() and pass NULL to ptr.
>> >> Check how it's done in avfilter_default_get_video_buffer().
>> >
>> > That's not so straight-forward. From what I understood in the
>> > function, to get the size of each plane I'd have to calculate some
>> > more based on data pointers, total size, and number of planes. And the
>> > size[] array in that function should already contain what I need.
>>
>> Something like attached (I know it's not ready yet, it duplicates code
>> and lacks documentation, but just to have an idea)
>
>> Index: libavcore/imgutils.h
>> ===================================================================
>> --- libavcore/imgutils.h ? ? ?(revision 24839)
>> +++ libavcore/imgutils.h ? ? ?(working copy)
>> @@ -78,6 +78,9 @@
>> ? */
>> ?int av_fill_image_linesizes(int linesizes[4], enum PixelFormat pix_fmt, int width);
>>
>> +int av_fill_image_plane_sizes(int size[4], enum PixelFormat pix_fmt,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int width, int height);
>> +
>
> This name or av_{fill,get}_image_planesizes() should be fine.
>
>> ?/**
>> ? * Fill plane data pointers for an image with pixel format pix_fmt and
>> ? * height height.
>> Index: libavcore/imgutils.c
>> ===================================================================
>> --- libavcore/imgutils.c ? ? ?(revision 24839)
>> +++ libavcore/imgutils.c ? ? ?(working copy)
>> @@ -65,6 +65,42 @@
>> ? ? ?return 0;
>> ?}
>>
>> +int av_fill_image_plane_sizes(int size[4], enum PixelFormat pix_fmt,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int width, int height)
>> +{
>> + ? ?int i, total_size, has_plane[4], linesizes[4];
>> +
>> + ? ?const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt];
>> + ? ?memset(size ? ? , 0, sizeof(size));
>> + ? ?memset(has_plane, 0, sizeof(has_plane));
>> +
>> + ? ?if (desc->flags & PIX_FMT_HWACCEL)
>> + ? ? ? ?return AVERROR(EINVAL);
>> +
>> + ? ?av_fill_image_linesizes(linesizes, pix_fmt, width);
>> +
>> + ? ?size[0] = linesizes[0] * height;
>> +
>> + ? ?if (desc->flags & PIX_FMT_PAL) {
>> + ? ? ? ?size[0] = (size[0] + 3) & ~3;
>> + ? ? ? ?size[1] = 256 * 4;
>> + ? ? ? ?return size[0] + size[1];
>> + ? ?}
>> +
>> + ? ?for (i = 0; i < 4; i++)
>> + ? ? ? ?has_plane[desc->comp[i].plane] = 1;
>> +
>> + ? ?total_size = size[0];
>> + ? ?for (i = 1; has_plane[i] && i < 4; i++) {
>> + ? ? ? ?int h, s = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
>> + ? ? ? ?h = (height + (1 << s) - 1) >> s;
>> + ? ? ? ?size[i] = h * linesizes[i];
>> + ? ? ? ?total_size += size[i];
>> + ? ?}
>> +
>> + ? ?return total_size;
>
> If you think this would be useful, I'm not against that. You can avoid
> duplication using the function inside av_fill_image_pointers().

New patches attached. The second patch would be split in smaller steps
when committing.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: add_av_fill_image_planesizes.diff
Type: text/x-patch
Size: 2757 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100904/3d9ae6bd/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: use_av_fill_image_planesizes.diff
Type: text/x-patch
Size: 5561 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100904/3d9ae6bd/attachment-0001.bin>



More information about the ffmpeg-devel mailing list