avformat/dashenc: Added comments
[ffmpeg.git] / libavformat / oggparsecelt.c
index 488fa28..9c438a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Xiph CELT / Opus parser for Ogg
+ * Xiph CELT parser for Ogg
  * Copyright (c) 2011 Nicolas George
  *
  * This file is part of FFmpeg.
  */
 
 #include <string.h>
+
+#include "libavutil/intreadwrite.h"
 #include "avformat.h"
+#include "internal.h"
 #include "oggdec.h"
-#include "libavutil/intreadwrite.h"
 
 struct oggcelt_private {
     int extra_headers_left;
@@ -38,54 +40,48 @@ static int celt_header(AVFormatContext *s, int idx)
 
     if (os->psize == 60 &&
         !memcmp(p, ff_celt_codec.magic, ff_celt_codec.magicsize)) {
-
         /* Main header */
 
-        uint32_t version, header_size, sample_rate, nb_channels, frame_size;
-        uint32_t overlap, bytes_per_packet, extra_headers;
-        uint8_t *extradata;
+        uint32_t version, sample_rate, nb_channels;
+        uint32_t overlap, extra_headers;
 
-        extradata = av_malloc(2 * sizeof(uint32_t) +
-                              FF_INPUT_BUFFER_PADDING_SIZE);
         priv = av_malloc(sizeof(struct oggcelt_private));
-        if (!extradata || !priv) {
-            av_free(extradata);
+        if (!priv)
+            return AVERROR(ENOMEM);
+        if (ff_alloc_extradata(st->codecpar, 2 * sizeof(uint32_t)) < 0) {
             av_free(priv);
             return AVERROR(ENOMEM);
         }
         version          = AV_RL32(p + 28);
-        header_size      = AV_RL32(p + 32); /* unused */
+        /* unused header size field skipped */
         sample_rate      = AV_RL32(p + 36);
         nb_channels      = AV_RL32(p + 40);
-        frame_size       = AV_RL32(p + 44);
         overlap          = AV_RL32(p + 48);
-        bytes_per_packet = AV_RL32(p + 52); /* unused */
+        /* unused bytes per packet field skipped */
         extra_headers    = AV_RL32(p + 56);
-        av_free(os->private);
-        av_free(st->codec->extradata);
-        st->codec->codec_type     = AVMEDIA_TYPE_AUDIO;
-        st->codec->codec_id       = CODEC_ID_CELT;
-        st->codec->sample_rate    = sample_rate;
-        st->codec->channels       = nb_channels;
-        st->codec->frame_size     = frame_size;
-        st->codec->sample_fmt     = AV_SAMPLE_FMT_S16;
-        st->codec->extradata      = extradata;
-        st->codec->extradata_size = 2 * sizeof(uint32_t);
-        av_set_pts_info(st, 64, 1, sample_rate);
-        priv->extra_headers_left  = 1 + extra_headers;
-        os->private = priv;
-        AV_WL32(extradata + 0, overlap);
-        AV_WL32(extradata + 4, version);
-        return 1;
+        st->codecpar->codec_type     = AVMEDIA_TYPE_AUDIO;
+        st->codecpar->codec_id       = AV_CODEC_ID_CELT;
+        st->codecpar->sample_rate    = sample_rate;
+        st->codecpar->channels       = nb_channels;
+        if (sample_rate)
+            avpriv_set_pts_info(st, 64, 1, sample_rate);
 
-    } else if(priv && priv->extra_headers_left) {
+        if (os->private) {
+            av_free(priv);
+            priv = os->private;
+        }
+        os->private = priv;
+        priv->extra_headers_left  = 1 + extra_headers;
 
+        AV_WL32(st->codecpar->extradata + 0, overlap);
+        AV_WL32(st->codecpar->extradata + 4, version);
+        return 1;
+    } else if (priv && priv->extra_headers_left) {
         /* Extra headers (vorbiscomment) */
 
-        ff_vorbis_comment(s, &st->metadata, p, os->psize);
+        ff_vorbis_stream_comment(s, st, p, os->psize);
         priv->extra_headers_left--;
         return 1;
-
     } else {
         return 0;
     }
@@ -95,4 +91,5 @@ const struct ogg_codec ff_celt_codec = {
     .magic     = "CELT    ",
     .magicsize = 8,
     .header    = celt_header,
+    .nb_header = 2,
 };