Merge commit '2f3fadfbe3c6ad52fad5c614b6067c5401227959'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 6 Nov 2014 11:05:17 +0000 (12:05 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 6 Nov 2014 11:05:17 +0000 (12:05 +0100)
* commit '2f3fadfbe3c6ad52fad5c614b6067c5401227959':
  lavc,lavf: switch to the new vorbis parse API

Conflicts:
libavformat/oggparsevorbis.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/libvorbisenc.c
libavcodec/vorbis_parser.c
libavformat/oggparsevorbis.c

  #include "libavutil/opt.h"
  #include "avcodec.h"
  #include "audio_frame_queue.h"
 -#include "bytestream.h"
  #include "internal.h"
  #include "vorbis.h"
- #include "vorbis_parser_internal.h"
+ #include "vorbis_parser.h"
  
 -#undef NDEBUG
 -#include <assert.h>
  
  /* Number of samples the user should send in each call.
   * This value is used because it is the LCD of all possible frame sizes, so
@@@ -48,13 -56,14 +48,13 @@@ typedef struct LibvorbisEncContext 
      int eof;                            /**< end-of-file flag               */
      int dsp_initialized;                /**< vd has been initialized        */
      vorbis_comment vc;                  /**< VorbisComment info             */
 -    ogg_packet op;                      /**< ogg packet                     */
      double iblock;                      /**< impulse block bias option      */
-     AVVorbisParseContext vp;            /**< parse context to get durations */
+     AVVorbisParseContext *vp;           /**< parse context to get durations */
      AudioFrameQueue afq;                /**< frame queue for timestamps     */
 -} LibvorbisContext;
 +} LibvorbisEncContext;
  
  static const AVOption options[] = {
 -    { "iblock", "Sets the impulse block bias", offsetof(LibvorbisContext, iblock), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, -15, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
 +    { "iblock", "Sets the impulse block bias", offsetof(LibvorbisEncContext, iblock), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, -15, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
      { NULL }
  };
  
@@@ -244,9 -221,10 +246,10 @@@ static av_cold int libvorbis_encode_ini
      offset += header_comm.bytes;
      memcpy(&p[offset], header_code.packet, header_code.bytes);
      offset += header_code.bytes;
 -    assert(offset == avctx->extradata_size);
 +    av_assert0(offset == avctx->extradata_size);
  
-     if ((ret = avpriv_vorbis_parse_extradata(avctx, &s->vp)) < 0) {
+     s->vp = av_vorbis_parse_init(avctx->extradata, avctx->extradata_size);
+     if (!s->vp) {
          av_log(avctx, AV_LOG_ERROR, "invalid extradata\n");
          return ret;
      }
Simple merge
@@@ -253,41 -245,13 +253,43 @@@ static void vorbis_cleanup(AVFormatCont
      struct ogg_stream *os = ogg->streams + idx;
      struct oggvorbis_private *priv = os->private;
      int i;
-     if (os->private)
+     if (os->private) {
+         av_vorbis_parse_free(&priv->vp);
          for (i = 0; i < 3; i++)
              av_freep(&priv->packet[i]);
+     }
  }
  
 +static int vorbis_update_metadata(AVFormatContext *s, int idx)
 +{
 +    struct ogg *ogg = s->priv_data;
 +    struct ogg_stream *os = ogg->streams + idx;
 +    AVStream *st = s->streams[idx];
 +    int ret;
 +
 +    if (os->psize <= 8)
 +        return 0;
 +
 +    /* New metadata packet; release old data. */
 +    av_dict_free(&st->metadata);
 +    ret = ff_vorbis_stream_comment(s, st, os->buf + os->pstart + 7,
 +                                   os->psize - 8);
 +    if (ret < 0)
 +        return ret;
 +
 +    /* Update the metadata if possible. */
 +    av_freep(&os->new_metadata);
 +    if (st->metadata) {
 +        os->new_metadata = av_packet_pack_dictionary(st->metadata, &os->new_metadata_size);
 +    /* Send an empty dictionary to indicate that metadata has been cleared. */
 +    } else {
 +        os->new_metadata = av_malloc(1);
 +        os->new_metadata_size = 0;
 +    }
 +
 +    return ret;
 +}
 +
  static int vorbis_header(AVFormatContext *s, int idx)
  {
      struct ogg *ogg = s->priv_data;
@@@ -406,27 -368,17 +410,27 @@@ static int vorbis_packet(AVFormatContex
       * here we parse the duration of each packet in the first page and compare
       * the total duration to the page granule to find the encoder delay and
       * set the first timestamp */
 -    if (!os->lastpts) {
 -        int seg;
 +    if ((!os->lastpts || os->lastpts == AV_NOPTS_VALUE) && !(os->flags & OGG_FLAG_EOS) && (int64_t)os->granule>=0) {
 +        int seg, d;
          uint8_t *last_pkt  = os->buf + os->pstart;
          uint8_t *next_pkt  = last_pkt;
 -        int first_duration = 0;
  
-         avpriv_vorbis_parse_reset(&priv->vp);
+         av_vorbis_parse_reset(priv->vp);
          duration = 0;
 -        for (seg = 0; seg < os->nsegs; seg++) {
 +        seg = os->segp;
-         d = avpriv_vorbis_parse_frame_flags(&priv->vp, last_pkt, 1, &flags);
++        d = av_vorbis_parse_frame_flags(priv->vp, last_pkt, 1, &flags);
 +        if (d < 0) {
 +            os->pflags |= AV_PKT_FLAG_CORRUPT;
 +            return 0;
 +        } else if (flags & VORBIS_FLAG_COMMENT) {
 +            vorbis_update_metadata(s, idx);
 +            flags = 0;
 +        }
 +        duration += d;
 +        last_pkt = next_pkt =  next_pkt + os->psize;
 +        for (; seg < os->nsegs; seg++) {
              if (os->segments[seg] < 255) {
-                 int d = avpriv_vorbis_parse_frame_flags(&priv->vp, last_pkt, 1, &flags);
 -                int d = av_vorbis_parse_frame(priv->vp, last_pkt, 1);
++                int d = av_vorbis_parse_frame_flags(priv->vp, last_pkt, 1, &flags);
                  if (d < 0) {
                      duration = os->granule;
                      break;
          }
          os->lastpts                 =
          os->lastdts                 = os->granule - duration;
 -        s->streams[idx]->start_time = os->lastpts + first_duration;
 -        if (s->streams[idx]->duration)
 -            s->streams[idx]->duration -= s->streams[idx]->start_time;
 -        s->streams[idx]->cur_dts = AV_NOPTS_VALUE;
 +
 +        if (!os->granule && duration) //hack to deal with broken files (Ticket3710)
 +            os->lastpts = os->lastdts = AV_NOPTS_VALUE;
 +
 +        if (s->streams[idx]->start_time == AV_NOPTS_VALUE) {
 +            s->streams[idx]->start_time = FFMAX(os->lastpts, 0);
 +            if (s->streams[idx]->duration != AV_NOPTS_VALUE)
 +                s->streams[idx]->duration -= s->streams[idx]->start_time;
 +        }
          priv->final_pts          = AV_NOPTS_VALUE;
-         avpriv_vorbis_parse_reset(&priv->vp);
+         av_vorbis_parse_reset(priv->vp);
      }
  
      /* parse packet duration */
      if (os->psize > 0) {
-         duration = avpriv_vorbis_parse_frame_flags(&priv->vp, os->buf + os->pstart, 1, &flags);
 -        duration = av_vorbis_parse_frame(priv->vp, os->buf + os->pstart, 1);
 -        if (duration <= 0) {
++        duration = av_vorbis_parse_frame_flags(priv->vp, os->buf + os->pstart, 1, &flags);
 +        if (duration < 0) {
              os->pflags |= AV_PKT_FLAG_CORRUPT;
              return 0;
 +        } else if (flags & VORBIS_FLAG_COMMENT) {
 +            vorbis_update_metadata(s, idx);
 +            flags = 0;
          }
          os->pduration = duration;
      }