Merge commit '90cfc084e3e6d37ab88fc96a95f0401d8e8b4cd1'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 14 Jan 2013 13:16:21 +0000 (14:16 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 14 Jan 2013 13:16:21 +0000 (14:16 +0100)
* commit '90cfc084e3e6d37ab88fc96a95f0401d8e8b4cd1':
  avpacket: free side data in av_free_packet().
  v4l2: do not assert on a value received from outside of Libav
  v4l2: set the average framerate instead of codec timebase.

Conflicts:
libavcodec/avpacket.c
libavdevice/v4l2.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/avpacket.c
libavdevice/v4l2.c

Simple merge
@@@ -472,66 -429,6 +472,66 @@@ static void mmap_release_buffer(AVPacke
      pkt->size = 0;
  }
  
-         int64_t period = av_rescale_q(1, ctx->streams[0]->codec->time_base,
-                                       AV_TIME_BASE_Q);
 +#if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
 +static int64_t av_gettime_monotonic(void)
 +{
 +    struct timespec tv;
 +
 +    clock_gettime(CLOCK_MONOTONIC, &tv);
 +    return (int64_t)tv.tv_sec * 1000000 + tv.tv_nsec / 1000;
 +}
 +#endif
 +
 +static int init_convert_timestamp(AVFormatContext *ctx, int64_t ts)
 +{
 +    struct video_data *s = ctx->priv_data;
 +    int64_t now;
 +
 +    now = av_gettime();
 +    if (s->ts_mode == V4L_TS_ABS &&
 +        ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * AV_TIME_BASE) {
 +        av_log(ctx, AV_LOG_INFO, "Detected absolute timestamps\n");
 +        s->ts_mode = V4L_TS_CONVERT_READY;
 +        return 0;
 +    }
 +#if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
 +    now = av_gettime_monotonic();
 +    if (s->ts_mode == V4L_TS_MONO2ABS ||
 +        (ts <= now + 1 * AV_TIME_BASE && ts >= now - 10 * AV_TIME_BASE)) {
++        int64_t period = av_rescale_q(1, AV_TIME_BASE_Q,
++                                      ctx->streams[0]->avg_frame_rate);
 +        av_log(ctx, AV_LOG_INFO, "Detected monotonic timestamps, converting\n");
 +        /* microseconds instead of seconds, MHz instead of Hz */
 +        s->timefilter = ff_timefilter_new(1, period, 1.0E-6);
 +        s->ts_mode = V4L_TS_CONVERT_READY;
 +        return 0;
 +    }
 +#endif
 +    av_log(ctx, AV_LOG_ERROR, "Unknown timestamps\n");
 +    return AVERROR(EIO);
 +}
 +
 +static int convert_timestamp(AVFormatContext *ctx, int64_t *ts)
 +{
 +    struct video_data *s = ctx->priv_data;
 +
 +    if (s->ts_mode) {
 +        int r = init_convert_timestamp(ctx, *ts);
 +        if (r < 0)
 +            return r;
 +    }
 +#if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
 +    if (s->timefilter) {
 +        int64_t nowa = av_gettime();
 +        int64_t nowm = av_gettime_monotonic();
 +        ff_timefilter_update(s->timefilter, nowa, nowm - s->last_time_m);
 +        s->last_time_m = nowm;
 +        *ts = ff_timefilter_eval(s->timefilter, *ts - nowm);
 +    }
 +#endif
 +    return 0;
 +}
 +
  static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
  {
      struct video_data *s = ctx->priv_data;
  
          return AVERROR(errno);
      }
-     av_assert0(buf.index < s->buffers);
+     if (buf.index >= s->buffers) {
+         av_log(ctx, AV_LOG_ERROR, "Invalid buffer index received.\n");
+         return AVERROR(EINVAL);
+     }
  
 +    /* CPIA is a compressed format and we don't know the exact number of bytes
 +     * used by a frame, so set it here as the driver announces it.
 +     */
 +    if (ctx->video_codec_id == AV_CODEC_ID_CPIA)
 +        s->frame_size = buf.bytesused;
 +
      if (s->frame_size > 0 && buf.bytesused != s->frame_size) {
          av_log(ctx, AV_LOG_ERROR,
                 "The v4l2 frame is %d bytes, but %d bytes are expected\n",
@@@ -735,9 -639,13 +739,9 @@@ static int v4l2_set_parameters(AVFormat
              return AVERROR(errno);
          }
      }
-     s1->streams[0]->codec->time_base.den = tpf->denominator;
-     s1->streams[0]->codec->time_base.num = tpf->numerator;
+     s1->streams[0]->avg_frame_rate.num = tpf->denominator;
+     s1->streams[0]->avg_frame_rate.den = tpf->numerator;
  
 -    s->timeout = 100 +
 -        av_rescale_q(1, s1->streams[0]->avg_frame_rate,
 -                        (AVRational){1, 1000});
 -
      return 0;
  }
  
@@@ -874,11 -782,9 +878,11 @@@ static int v4l2_read_header(AVFormatCon
      if (codec_id == AV_CODEC_ID_RAWVIDEO)
          st->codec->codec_tag =
              avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
 +    if (desired_format == V4L2_PIX_FMT_YVU420)
 +        st->codec->codec_tag = MKTAG('Y', 'V', '1', '2');
      st->codec->width = s->width;
      st->codec->height = s->height;
-     st->codec->bit_rate = s->frame_size * 1/av_q2d(st->codec->time_base) * 8;
+     st->codec->bit_rate = s->frame_size * av_q2d(st->avg_frame_rate) * 8;
  
      return 0;
  }