OSDN Git Service

Merge commit '0d1229f1d2b8f26dd50c6be7917bb8ed8cb95364'
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>
Wed, 24 Feb 2016 18:04:34 +0000 (18:04 +0000)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Wed, 24 Feb 2016 18:04:34 +0000 (18:04 +0000)
* commit '0d1229f1d2b8f26dd50c6be7917bb8ed8cb95364':
  voc: Split ff_voc_get_packet into a separate file

Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
1  2 
libavformat/Makefile
libavformat/voc_packet.c
libavformat/vocdec.c

@@@ -100,25 -81,17 +100,25 @@@ OBJS-$(CONFIG_AST_MUXER
  OBJS-$(CONFIG_AU_DEMUXER)                += au.o pcm.o
  OBJS-$(CONFIG_AU_MUXER)                  += au.o rawenc.o
  OBJS-$(CONFIG_AVI_DEMUXER)               += avidec.o
 -OBJS-$(CONFIG_AVI_MUXER)                 += avienc.o
 +OBJS-$(CONFIG_AVI_MUXER)                 += avienc.o mpegtsenc.o avlanguage.o rawutils.o
  OBJS-$(CONFIG_AVISYNTH)                  += avisynth.o
  OBJS-$(CONFIG_AVM2_MUXER)                += swfenc.o swf.o
 -OBJS-$(CONFIG_AVS_DEMUXER)               += avs.o voc_packet.o voc.o
 +OBJS-$(CONFIG_AVR_DEMUXER)               += avr.o pcm.o
- OBJS-$(CONFIG_AVS_DEMUXER)               += avs.o vocdec.o voc.o
++OBJS-$(CONFIG_AVS_DEMUXER)               += avs.o voc_packet.o vocdec.o voc.o
  OBJS-$(CONFIG_BETHSOFTVID_DEMUXER)       += bethsoftvid.o
  OBJS-$(CONFIG_BFI_DEMUXER)               += bfi.o
  OBJS-$(CONFIG_BINK_DEMUXER)              += bink.o
 +OBJS-$(CONFIG_BINTEXT_DEMUXER)           += bintext.o sauce.o
 +OBJS-$(CONFIG_BIT_DEMUXER)               += bit.o
 +OBJS-$(CONFIG_BIT_MUXER)                 += bit.o
  OBJS-$(CONFIG_BMV_DEMUXER)               += bmv.o
 -OBJS-$(CONFIG_C93_DEMUXER)               += c93.o voc_packet.o voc.o
 +OBJS-$(CONFIG_BOA_DEMUXER)               += boadec.o
 +OBJS-$(CONFIG_BFSTM_DEMUXER)             += brstm.o
 +OBJS-$(CONFIG_BRSTM_DEMUXER)             += brstm.o
- OBJS-$(CONFIG_C93_DEMUXER)               += c93.o vocdec.o voc.o
++OBJS-$(CONFIG_C93_DEMUXER)               += c93.o voc_packet.o vocdec.o voc.o
  OBJS-$(CONFIG_CAF_DEMUXER)               += cafdec.o caf.o mov.o mov_chan.o \
                                              replaygain.o
 +OBJS-$(CONFIG_CAF_MUXER)                 += cafenc.o caf.o riff.o isom.o
  OBJS-$(CONFIG_CAVSVIDEO_DEMUXER)         += cavsvideodec.o rawdec.o
  OBJS-$(CONFIG_CAVSVIDEO_MUXER)           += rawenc.o
  OBJS-$(CONFIG_CDG_DEMUXER)               += cdg.o
@@@ -440,36 -338,22 +440,36 @@@ OBJS-$(CONFIG_SVAG_DEMUXER
  OBJS-$(CONFIG_SWF_DEMUXER)               += swfdec.o swf.o
  OBJS-$(CONFIG_SWF_MUXER)                 += swfenc.o swf.o
  OBJS-$(CONFIG_TAK_DEMUXER)               += takdec.o apetag.o img2.o rawdec.o
 +OBJS-$(CONFIG_TEDCAPTIONS_DEMUXER)       += tedcaptionsdec.o subtitles.o
 +OBJS-$(CONFIG_TEE_MUXER)                 += tee.o
  OBJS-$(CONFIG_THP_DEMUXER)               += thp.o
 +OBJS-$(CONFIG_THREEDOSTR_DEMUXER)        += 3dostr.o
  OBJS-$(CONFIG_TIERTEXSEQ_DEMUXER)        += tiertexseq.o
 +OBJS-$(CONFIG_MKVTIMESTAMP_V2_MUXER)     += mkvtimestamp_v2.o
  OBJS-$(CONFIG_TMV_DEMUXER)               += tmv.o
 -OBJS-$(CONFIG_TRUEHD_DEMUXER)            += rawdec.o
 +OBJS-$(CONFIG_TRUEHD_DEMUXER)            += rawdec.o mlpdec.o
  OBJS-$(CONFIG_TRUEHD_MUXER)              += rawenc.o
 -OBJS-$(CONFIG_TTA_DEMUXER)               += tta.o
 +OBJS-$(CONFIG_TTA_DEMUXER)               += tta.o apetag.o img2.o
  OBJS-$(CONFIG_TTY_DEMUXER)               += tty.o sauce.o
  OBJS-$(CONFIG_TXD_DEMUXER)               += txd.o
 -OBJS-$(CONFIG_VC1_DEMUXER)               += rawdec.o
 +OBJS-$(CONFIG_UNCODEDFRAMECRC_MUXER)     += uncodedframecrcenc.o framehash.o
 +OBJS-$(CONFIG_V210_DEMUXER)              += v210.o
 +OBJS-$(CONFIG_V210X_DEMUXER)             += v210.o
 +OBJS-$(CONFIG_VAG_DEMUXER)               += vag.o
 +OBJS-$(CONFIG_VC1_DEMUXER)               += rawdec.o vc1dec.o
 +OBJS-$(CONFIG_VC1_MUXER)                 += rawenc.o
  OBJS-$(CONFIG_VC1T_DEMUXER)              += vc1test.o
  OBJS-$(CONFIG_VC1T_MUXER)                += vc1testenc.o
 +OBJS-$(CONFIG_VIVO_DEMUXER)              += vivo.o
  OBJS-$(CONFIG_VMD_DEMUXER)               += sierravmd.o
- OBJS-$(CONFIG_VOC_DEMUXER)               += vocdec.o voc.o
 +OBJS-$(CONFIG_VOBSUB_DEMUXER)            += subtitles.o # mpeg demuxer is in the dependencies
+ OBJS-$(CONFIG_VOC_DEMUXER)               += vocdec.o voc_packet.o voc.o
  OBJS-$(CONFIG_VOC_MUXER)                 += vocenc.o voc.o
 +OBJS-$(CONFIG_VPK_DEMUXER)               += vpk.o
 +OBJS-$(CONFIG_VPLAYER_DEMUXER)           += vplayerdec.o subtitles.o
  OBJS-$(CONFIG_VQF_DEMUXER)               += vqf.o
 -OBJS-$(CONFIG_W64_DEMUXER)               += wavdec.o pcm.o
 +OBJS-$(CONFIG_W64_DEMUXER)               += wavdec.o w64.o pcm.o
 +OBJS-$(CONFIG_W64_MUXER)                 += wavenc.o w64.o
  OBJS-$(CONFIG_WAV_DEMUXER)               += wavdec.o pcm.o
  OBJS-$(CONFIG_WAV_MUXER)                 += wavenc.o
  OBJS-$(CONFIG_WC3_DEMUXER)               += wc3movie.o
index 0000000,9e1c746..f4b8231
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,119 +1,141 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * Copyright (c) 2006  Aurelien Jacobs <aurel@gnuage.org>
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
 -            return AVERROR(EIO);
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
++#include "libavutil/intreadwrite.h"
+ #include "avformat.h"
+ #include "internal.h"
+ #include "voc.h"
+ int
+ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
+ {
+     VocDecContext *voc = s->priv_data;
+     AVCodecContext *dec = st->codec;
+     AVIOContext *pb = s->pb;
+     VocType type;
+     int size, tmp_codec=-1;
+     int sample_rate = 0;
+     int channels = 1;
++    int64_t duration;
++    int ret;
++
++    av_add_index_entry(st,
++                       avio_tell(pb),
++                       voc->pts,
++                       voc->remaining_size,
++                       0,
++                       AVINDEX_KEYFRAME);
+     while (!voc->remaining_size) {
+         type = avio_r8(pb);
+         if (type == VOC_TYPE_EOF)
 -    dec->bit_rate = dec->sample_rate * dec->bits_per_coded_sample;
++            return AVERROR_EOF;
+         voc->remaining_size = avio_rl24(pb);
+         if (!voc->remaining_size) {
+             if (!s->pb->seekable)
+                 return AVERROR(EIO);
+             voc->remaining_size = avio_size(pb) - avio_tell(pb);
+         }
+         max_size -= 4;
+         switch (type) {
+         case VOC_TYPE_VOICE_DATA:
+             if (!dec->sample_rate) {
+                 dec->sample_rate = 1000000 / (256 - avio_r8(pb));
+                 if (sample_rate)
+                     dec->sample_rate = sample_rate;
+                 avpriv_set_pts_info(st, 64, 1, dec->sample_rate);
+                 dec->channels = channels;
+                 dec->bits_per_coded_sample = av_get_bits_per_sample(dec->codec_id);
+             } else
+                 avio_skip(pb, 1);
+             tmp_codec = avio_r8(pb);
+             voc->remaining_size -= 2;
+             max_size -= 2;
+             channels = 1;
+             break;
+         case VOC_TYPE_VOICE_DATA_CONT:
+             break;
+         case VOC_TYPE_EXTENDED:
+             sample_rate = avio_rl16(pb);
+             avio_r8(pb);
+             channels = avio_r8(pb) + 1;
+             sample_rate = 256000000 / (channels * (65536 - sample_rate));
+             voc->remaining_size = 0;
+             max_size -= 4;
+             break;
+         case VOC_TYPE_NEW_VOICE_DATA:
+             if (!dec->sample_rate) {
+                 dec->sample_rate = avio_rl32(pb);
+                 avpriv_set_pts_info(st, 64, 1, dec->sample_rate);
+                 dec->bits_per_coded_sample = avio_r8(pb);
+                 dec->channels = avio_r8(pb);
+             } else
+                 avio_skip(pb, 6);
+             tmp_codec = avio_rl16(pb);
+             avio_skip(pb, 4);
+             voc->remaining_size -= 12;
+             max_size -= 12;
+             break;
+         default:
+             avio_skip(pb, voc->remaining_size);
+             max_size -= voc->remaining_size;
+             voc->remaining_size = 0;
+             break;
+         }
+     }
+     if (tmp_codec >= 0) {
+         tmp_codec = ff_codec_get_id(ff_voc_codec_tags, tmp_codec);
+         if (dec->codec_id == AV_CODEC_ID_NONE)
+             dec->codec_id = tmp_codec;
+         else if (dec->codec_id != tmp_codec)
+             av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n");
+         if (dec->codec_id == AV_CODEC_ID_NONE) {
+             if (s->audio_codec_id == AV_CODEC_ID_NONE) {
+                 av_log(s, AV_LOG_ERROR, "unknown codec tag\n");
+                 return AVERROR(EINVAL);
+             }
+             av_log(s, AV_LOG_WARNING, "unknown codec tag\n");
+         }
+     }
 -    return av_get_packet(pb, pkt, size);
++    dec->bit_rate = dec->sample_rate * dec->channels * dec->bits_per_coded_sample;
+     if (max_size <= 0)
+         max_size = 2048;
+     size = FFMIN(voc->remaining_size, max_size);
+     voc->remaining_size -= size;
++
++    ret = av_get_packet(pb, pkt, size);
++    pkt->dts = pkt->pts = voc->pts;
++
++    duration = av_get_audio_frame_duration(st->codec, size);
++    if (duration > 0 && voc->pts != AV_NOPTS_VALUE)
++        voc->pts += duration;
++    else
++        voc->pts = AV_NOPTS_VALUE;
++
++    return ret;
+ }
@@@ -212,7 -75,5 +94,6 @@@ AVInputFormat ff_voc_demuxer = 
      .read_probe     = voc_probe,
      .read_header    = voc_read_header,
      .read_packet    = voc_read_packet,
 +    .read_seek      = voc_read_seek,
      .codec_tag      = (const AVCodecTag* const []){ ff_voc_codec_tags, 0 },
  };
- #endif /* CONFIG_VOC_DEMUXER */