[Ffmpeg-devel] [PATCH] video grab support VIDEO_PALETTE_RGB565
Michael Niedermayer
michaelni
Mon Apr 30 14:28:32 CEST 2007
Hi
On Mon, Apr 30, 2007 at 07:30:24PM +0800, yi li wrote:
> I made some changes accordingly. Hope it is better.
>
> Regards,
> -Yi
>
> On 4/29/07, Michael Niedermayer <michaelni at gmx.at> wrote:
> >
> >Hi
> >
> >On Sun, Apr 29, 2007 at 03:20:03PM +0800, yi li wrote:
> >> Hi,
> >>
> >> A small patch for libavformat/grab.c to make it support v4l device with
> >> "VIDEO_PALETTE_RGB565" format.
> >> Any comments?
> >>
> >> Regards,
> >>
> >> -Yi
> >
> >> --- grab.c.orig 2007-04-29 15:14:43.000000000 +0800
> >> +++ grab.c 2007-04-29 15:13:36.000000000 +0800
> >> @@ -174,8 +174,13 @@
> >> pict.palette=VIDEO_PALETTE_GREY;
> >> pict.depth=8;
> >> ret = ioctl(video_fd, VIDIOCSPICT, &pict);
> >> - if (ret < 0)
> >> - goto fail1;
> >> + if (ret < 0) {
> >> + pict.palette=VIDEO_PALETTE_RGB565;
> >> + pict.depth=16;
> >> + ret = ioctl(video_fd, VIDIOCSPICT, &pict);
> >> + if (ret < 0)
> >> + goto fail1;
> >> + }
> >> }
> >
> >tabs are forbidden in svn
> >rgb565 should be checked before gray
> >and ideally the whole should be simplified, a simple table with
> >VIDEO_PALETTE_*, depth, pix_fmt and frame_size factor could be used
[...]
> --- grab.c.orig 2007-04-30 13:52:26.000000000 +0800
> +++ grab.c 2007-04-30 19:21:38.000000000 +0800
> @@ -53,6 +53,19 @@
> uint8_t *lum_m4_mem;
> } VideoData;
>
> +struct {
> + int palette;
> + int depth;
> + enum PixelFormat pix_fmt;
> +} video_formats [] = {
> + {.palette = VIDEO_PALETTE_YUV420P, .depth = 12, .pix_fmt = PIX_FMT_YUV420P},
> + {.palette = VIDEO_PALETTE_YUV422, .depth = 16, .pix_fmt = PIX_FMT_YUYV422},
> + {.palette = VIDEO_PALETTE_RGB24, .depth = 24,
trailing whitespace is forbidden in svn
> + .pix_fmt = PIX_FMT_BGR24}, /* NOTE: v4l uses BGR24, not RGB24 ! */
> + {.palette = VIDEO_PALETTE_RGB565, .depth = 16, .pix_fmt = PIX_FMT_BGR565},
> + {.palette = VIDEO_PALETTE_GREY, .depth = 8, .pix_fmt = PIX_FMT_GRAY8}
> +};
this would be more readable if things where vertically aligned like:
{.palette = VIDEO_PALETTE_RGB565, .depth = 16, .pix_fmt = PIX_FMT_BGR565},
{.palette = VIDEO_PALETTE_GREY , .depth = 8, .pix_fmt = PIX_FMT_GRAY8}
also i think the .palette, .depth, ... hurts readability more than it helps
[...]
> @@ -158,27 +172,15 @@
> /* try to choose a suitable video format */
> pict.palette = desired_palette;
> pict.depth= desired_depth;
> - if (desired_palette == -1 || (ret = ioctl(video_fd, VIDIOCSPICT, &pict)) < 0) {
> - pict.palette=VIDEO_PALETTE_YUV420P;
> - pict.depth=12;
> - ret = ioctl(video_fd, VIDIOCSPICT, &pict);
> - if (ret < 0) {
> - pict.palette=VIDEO_PALETTE_YUV422;
> - pict.depth=16;
> - ret = ioctl(video_fd, VIDIOCSPICT, &pict);
> - if (ret < 0) {
> - pict.palette=VIDEO_PALETTE_RGB24;
> - pict.depth=24;
> - ret = ioctl(video_fd, VIDIOCSPICT, &pict);
> - if (ret < 0) {
> - pict.palette=VIDEO_PALETTE_GREY;
> - pict.depth=8;
> - ret = ioctl(video_fd, VIDIOCSPICT, &pict);
> - if (ret < 0)
> - goto fail1;
> - }
> - }
> + if (desired_palette == -1) {
> + for (j = 0; j < vformat_num; j++) {
> + pict.palette = video_formats[j].palette;
> + pict.depth = video_formats[j].depth;
> + if (-1 != ioctl(video_fd, VIDIOCSPICT, &pict))
> + break;
i think this should rather stay <0 instead of ==-1
[...]
> @@ -248,27 +250,18 @@
> s->frame_format = s->gb_buf.format;
> s->use_mmap = 1;
> }
> -
> - switch(s->frame_format) {
> - case VIDEO_PALETTE_YUV420P:
> - frame_size = (width * height * 3) / 2;
> - st->codec->pix_fmt = PIX_FMT_YUV420P;
> - break;
> - case VIDEO_PALETTE_YUV422:
> - frame_size = width * height * 2;
> - st->codec->pix_fmt = PIX_FMT_YUYV422;
> - break;
> - case VIDEO_PALETTE_RGB24:
> - frame_size = width * height * 3;
> - st->codec->pix_fmt = PIX_FMT_BGR24; /* NOTE: v4l uses BGR24, not RGB24 ! */
> - break;
> - case VIDEO_PALETTE_GREY:
> - frame_size = width * height * 1;
> - st->codec->pix_fmt = PIX_FMT_GRAY8;
> - break;
> - default:
> - goto fail;
> +
> + for (j = 0; j < vformat_num; j++) {
> + if (s->frame_format == video_formats[j].palette) {
> + frame_size = width * height * video_formats[j].depth / sizeof(char);
sizeof(char) = 1
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
No snowflake in an avalanche ever feels responsible. -- Voltaire
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20070430/19d802ed/attachment.pgp>
More information about the ffmpeg-devel
mailing list