On date Wednesday 2011-05-25 16:27:39 +0200, Anton Khirnov encoded:
> ---
> libavdevice/fbdev.c | 37 +++++++++++++++++++++++++------------
> 1 files changed, 25 insertions(+), 12 deletions(-)
>
> diff --git a/libavdevice/fbdev.c b/libavdevice/fbdev.c
> index 6b03be4..01c4edc 100644
> --- a/libavdevice/fbdev.c
> +++ b/libavdevice/fbdev.c
> @@ -37,7 +37,9 @@
> #include <time.h>
> #include <linux/fb.h>
>
> +#include "libavutil/log.h"
> #include "libavutil/mem.h"
> +#include "libavutil/opt.h"
> #include "libavutil/pixdesc.h"
> #include "libavformat/avformat.h"
>
> @@ -74,8 +76,9 @@ static enum PixelFormat get_pixfmt_from_fb_varinfo(struct
> fb_var_screeninfo *var
> }
>
> typedef struct {
> + AVClass *class; ///< class for private options
> int frame_size; ///< size in bytes of a grabbed frame
> - AVRational time_base; ///< time base
> + AVRational fps; ///< framerate
> int64_t time_frame; ///< time for the next frame to output (in
> 1/1000000 units)
>
> int fd; ///< framebuffer device file descriptor
> @@ -101,11 +104,6 @@ av_cold static int fbdev_read_header(AVFormatContext
> *avctx,
> return AVERROR(ENOMEM);
> av_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in microseconds */
>
> - if (ap->time_base.den <= 0) {
> - av_log(avctx, AV_LOG_ERROR, "Invalid time base %d/%d\n",
> - ap->time_base.num, ap->time_base.den);
> - return AVERROR(EINVAL);
> - }
Maybe under #if FF_API_FORMAT_PARAMETERS? Or you're disabling the
check even when format_parameters is still in use.
> /* NONBLOCK is ignored by the fbdev driver, only set for consistency */
> if (avctx->flags & AVFMT_FLAG_NONBLOCK)
> @@ -146,7 +144,10 @@ av_cold static int fbdev_read_header(AVFormatContext
> *avctx,
> fbdev->bytes_per_pixel = (fbdev->varinfo.bits_per_pixel + 7) >> 3;
> fbdev->frame_linesize = fbdev->width * fbdev->bytes_per_pixel;
> fbdev->frame_size = fbdev->frame_linesize * fbdev->heigth;
> - fbdev->time_base = ap->time_base;
> +#if FF_API_FORMAT_PARAMETERS
> + if (ap->time_base.num)
> + fbdev->fps = (AVRational){ap->time_base.den, ap->time_base.num};
> +#endif
> fbdev->time_frame = AV_NOPTS_VALUE;
> fbdev->data = mmap(NULL, fbdev->fixinfo.smem_len, PROT_READ, MAP_SHARED,
> fbdev->fd, 0);
> if (fbdev->data == MAP_FAILED) {
> @@ -160,15 +161,15 @@ av_cold static int fbdev_read_header(AVFormatContext
> *avctx,
> st->codec->width = fbdev->width;
> st->codec->height = fbdev->heigth;
> st->codec->pix_fmt = pix_fmt;
> - st->codec->time_base = ap->time_base;
> + st->codec->time_base = (AVRational){fbdev->fps.den, fbdev->fps.num};
> st->codec->bit_rate =
> - fbdev->width * fbdev->heigth * fbdev->bytes_per_pixel /
> av_q2d(ap->time_base) * 8;
> + fbdev->width * fbdev->heigth * fbdev->bytes_per_pixel *
> av_q2d(fbdev->fps) * 8;
>
> av_log(avctx, AV_LOG_INFO,
> - "w:%d h:%d bpp:%d pixfmt:%s tb:%d/%d bit_rate:%d\n",
> + "w:%d h:%d bpp:%d pixfmt:%s fps:%d/%d bit_rate:%d\n",
> fbdev->width, fbdev->heigth, fbdev->varinfo.bits_per_pixel,
> av_pix_fmt_descriptors[pix_fmt].name,
> - ap->time_base.num, ap->time_base.den,
> + fbdev->fps.num, fbdev->fps.den,
> st->codec->bit_rate);
> return 0;
>
> @@ -202,7 +203,7 @@ static int fbdev_read_packet(AVFormatContext *avctx,
> AVPacket *pkt)
> while (nanosleep(&ts, &ts) < 0 && errno == EINTR);
> }
> /* compute the time of the next frame */
> - fbdev->time_frame += INT64_C(1000000) * av_q2d(fbdev->time_base);
> + fbdev->time_frame += INT64_C(1000000) / av_q2d(fbdev->fps);
>
> if ((ret = av_new_packet(pkt, fbdev->frame_size)) < 0)
> return ret;
> @@ -239,6 +240,17 @@ av_cold static int fbdev_read_close(AVFormatContext
> *avctx)
> return 0;
> }
>
> +static const AVOption options[] = {
> + { "framerate","", offsetof(FBDevContext, fps), FF_OPT_TYPE_RATIONAL,
> {.dbl = 25}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
> + { NULL },
I'd prefer to use av_parse_frame_rate() here, for allowing framerate
abbreviations.
--
The secret source of humor is not joy but sorrow; there is no humor in Heaven.
-- Mark Twain
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel