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

Reply via email to