Beispiel #1
0
        public override void Convert(AudioFrame inFrame, AudioFrame outFrame)
        {
            if (kernelCount > 1 && kernelCount != inFrame.format.Channels)
            {
                throw new ArgumentException($"{nameof(inFrame)}的数据行数和卷积核个数不一致", nameof(inFrame));
            }

            var inFormat   = inFrame.format;
            var inSamples  = inFrame.sampleCount;
            var outSamples = convs[0].GetOutLength(inSamples);
            var outFormat  = inFormat;

            if (resampler == null && inFormat.SampleFormat != AVSampleFormat.DoublePlanar)
            {
                outFormat = new AudioFormat(inFormat.SampleRate, inFormat.ChannelLayout, inFormat.SampleFormat.ToPlanar());
                resampler = new AudioResampler(inFormat, outFormat);
            }
            if (resampler != null)
            {
                resampler.Resample(inFrame, tempInput);
                inFrame = tempInput;
            }

            outFrame.Resize(outFormat, outSamples);

            for (int i = 0; i < kernelCount; i++)
            {
                convs[kernelCount == 1 ? 0 : i].Convolve((double *)inFrame.datas[i], inSamples, (double *)outFrame.datas[i], outSamples);
            }
        }
        public static void ToPlanar(AudioFrame inOutFrame)
        {
            AudioResampler resampler = GetPlanarResampler(inOutFrame.format);

            if (resampler == null)
            {
                return;
            }

            var samples = inOutFrame.SampleCount;
            int bytes   = resampler.GetOutBytes(samples);

            packedCache.Resize(bytes);
            var data = packedCache.data;

            Buffer.MemoryCopy((void *)inOutFrame.datas[0], (void *)data, bytes, bytes);
            int lineBytes = resampler.Destination.GetLineBytes(samples);

            inOutFrame.format = resampler.Destination;
            inOutFrame.Resize(samples);
            fixed(IntPtr *input = inOutFrame.datas)
            {
                resampler.Resample((IntPtr)(&data), samples, (IntPtr)input, samples);
            }

            inOutFrame.sampleCount = samples;
        }
 protected override void Dispose(bool disposing)
 {
     if (disposing)
     {
         resampler?.Dispose();
         resampler = null;
     }
     base.Dispose(disposing);
 }
Beispiel #4
0
 protected override void Dispose(bool disposing)
 {
     if (disposing)
     {
         resampler?.Dispose();
         tempInput.Dispose();
         if (convs != null)
         {
             Array.ForEach(convs, conv => conv.Dispose());
         }
         resampler = null;
         tempInput = null;
         convs     = null;
     }
 }
        public static AudioResampler GetPlanarResampler(AudioFormat packedFormat)
        {
            if (packedFormat.IsPlanarFormat)
            {
                return(null);
            }

            if (planarResamplers.TryGetValue(packedFormat, out AudioResampler resampler))
            {
                return(resampler);
            }
            resampler = new AudioResampler(packedFormat, packedFormat.ToPlanar());
            planarResamplers.Add(packedFormat, resampler);
            return(resampler);
        }
Beispiel #6
0
        public void PackedCopyTo(IntPtr outBuffer, int bufferBytes)
        {
            int lineBytes = format.GetLineBytes(sampleCount);

            if (!format.IsPlanarFormat)
            {
                Buffer.MemoryCopy((void *)cache, (void *)outBuffer, bufferBytes, lineBytes);
                return;
            }

            var resampler = AudioResampler.GetPackedResampler(format);

            fixed(IntPtr *input = datas)
            {
                resampler.Resample((IntPtr)input, SampleCount, (IntPtr)(&outBuffer), SampleCount);
            }
        }
Beispiel #7
0
        public static AudioResampler GetPackedResampler(AudioFormat planarFormat)
        {
            if (!planarFormat.IsPlanarFormat)
            {
                return(null);
            }

            AudioResampler resampler;

            if (planarResamplers.TryGetValue(planarFormat, out resampler))
            {
                return(resampler);
            }
            resampler = new AudioResampler(planarFormat, planarFormat.ToPacked());
            planarResamplers.Add(planarFormat, resampler);
            return(resampler);
        }
Beispiel #8
0
        private void Init(AVCodecID codecID, BitRate bitRate)
        {
            outFormat = MatchSupportedFormat(codecID, InFormat);
            if (!InFormat.Equals(OutFormat))
            {
                resampler = new AudioResampler(InFormat, OutFormat);
                tempFrame = new AudioFrame();
            }

            codecContext->SampleFmt     = outFormat.SampleFormat;
            codecContext->SampleRate    = outFormat.SampleRate;
            codecContext->ChannelLayout = outFormat.ChannelLayout;
            codecContext->Channels      = outFormat.Channels;
            codecContext->BitRate       = bitRate.Value;
            var rates = codecContext->Flags;

            int result = FF.avcodec_open2(codecContext, codec, null);

            if (result < 0)
            {
                throw new FFmpegException(result);
            }
        }
        public static void ToPacked(AudioFrame inOutFrame)
        {
            AudioResampler resampler = GetPackedResampler(inOutFrame.format);

            if (resampler == null)
            {
                return;
            }

            var samples = inOutFrame.SampleCount;
            int bytes   = resampler.GetOutBytes(samples);

            packedCache.Resize(bytes);
            var data = packedCache.data;

            fixed(IntPtr *input = inOutFrame.datas)
            {
                resampler.Resample((IntPtr)input, samples, (IntPtr)(&data), samples);
            }

            inOutFrame.format = resampler.Destination;
            inOutFrame.Update(samples, packedCache.data);
        }
Beispiel #10
0
 public void ToPlanar()
 {
     AudioResampler.ToPlanar(this);
 }
Beispiel #11
0
 public void ToPacked()
 {
     AudioResampler.ToPacked(this);
 }