[FFmpeg-soc] [soc] libavsequencer [PATCH 06/08] Instrument sample handling public API header file.

Sebastian Vater cdgs.basty at googlemail.com
Sat Aug 14 15:23:07 CEST 2010


Vitor Sessak a écrit :
> On 08/13/2010 10:43 PM, Sebastian Vater wrote:
>> Vitor Sessak a écrit :
>>> On 08/07/2010 09:56 PM, Sebastian Vater wrote:
>>>> Sebastian Vater a écrit :
>>>>> Updated patch.
>>>>>
>>>>>
>>>>
>>>> Hi I have excellent news!
>>>>
>>>> libavsequencer now flawlessly integrates into FFmpeg, just check
>>>> out my
>>>> latest git. Please do a git pull --rebase, Stefano had problems
>>>> without
>>>> using it.
>>>>
>>>> Here are the sample.[ch] part of the BSS to review.
>>>>
>>>> This version compiles perfectly.
>>>
>>>
>>>> sample.h_20100807.patch
>>>>
>>>> diff --git a/libavsequencer/sample.h b/libavsequencer/sample.h
>>>> new file mode 100755
>>>> index 0000000..2da365f
>>>> --- /dev/null
>>>> +++ b/libavsequencer/sample.h
>>>> @@ -0,0 +1,302 @@
>>>> +/*
>>>> + * AVSequencer samples management
>>>> + * Copyright (c) 2010 Sebastian Vater<cdgs.basty at googlemail.com>
>>>> + *
>>>> + * 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.
>>>> + *
>>>> + * 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
>>>> + * License along with FFmpeg; if not, write to the Free Software
>>>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>>>> 02110-1301 USA
>>>> + */
>>>> +
>>>> +#ifndef AVSEQUENCER_SAMPLE_H
>>>> +#define AVSEQUENCER_SAMPLE_H
>>>> +
>>>> +#include "libavutil/log.h"
>>>> +#include "libavformat/avformat.h"
>>>> +#include "libavsequencer/synth.h"
>>>> +
>>>> +/** AVSequencerSample->compat_flags bitfield.  */
>>>> +enum AVSequencerSampleCompatFlags {
>>>> +    AVSEQ_SAMPLE_COMPAT_FLAG_AFFECT_CHANNEL_PAN     = 0x01, ///<
>>>> Sample panning affects channel panning (IT compatibility)
>>>> +    AVSEQ_SAMPLE_COMPAT_FLAG_VOLUME_ONLY            = 0x02, ///<  If
>>>> a note without a sample is played, only the sample volume will be
>>>> left unchanged
>>>> +    AVSEQ_SAMPLE_COMPAT_FLAG_START_TONE_PORTAMENTO  = 0x04, ///<  If
>>>> a tone portamento with a note is executed but no note is currently
>>>> played, the tone portamento will be ignored and start playing the
>>>> note normally
>>>> +    AVSEQ_SAMPLE_COMPAT_FLAG_PLAY_BEGIN_TONE_PORTA  = 0x08, ///<  If
>>>> you change a sample within a tone portamento the sample will be
>>>> played from beginning
>>>> +};
>>>> +
>>>> +/** AVSequencerSample->flags bitfield.  */
>>>> +enum AVSequencerSampleFlags {
>>>> +    AVSEQ_SAMPLE_FLAG_REDIRECT          = 0x01, ///<  Sample is a
>>>> redirection (symbolic link)
>>>> +    AVSEQ_SAMPLE_FLAG_LOOP              = 0x02, ///<  Use normal loop
>>>> points
>>>> +    AVSEQ_SAMPLE_FLAG_SUSTAIN_LOOP      = 0x04, ///<  Use sustain
>>>> loop points
>>>> +    AVSEQ_SAMPLE_FLAG_SAMPLE_PANNING    = 0x08, ///<  Use sample
>>>> panning
>>>> +    AVSEQ_SAMPLE_FLAG_SURROUND_PANNING  = 0x10, ///<  Sample panning
>>>> is surround panning
>>>> +    AVSEQ_SAMPLE_FLAG_REVERSE           = 0x40, ///<  Sample will be
>>>> initially played backwards
>>>> +};
>>>> +
>>>> +/** AVSequencerSample->repeat_mode bitfield.  */
>>>> +enum AVSequencerSampleRepMode {
>>>> +    AVSEQ_SAMPLE_REP_MODE_BACKWARDS = 0x01, ///<  Use always backward
>>>> instead of always forward loop
>>>> +    AVSEQ_SAMPLE_REP_MODE_PINGPONG  = 0x02, ///<  Use ping-pong loop
>>>> mode, i.e. forward<->  backward
>>>> +};
>>>> +
>>>> +/** AVSequencerSample->sustain_repeat_mode bitfield.  */
>>>> +enum AVSequencerSampleSustainRepMode {
>>>> +    AVSEQ_SAMPLE_SUSTAIN_REP_MODE_BACKWARDS = 0x01, ///<  Use always
>>>> backward instead of always forward loop
>>>> +    AVSEQ_SAMPLE_SUSTAIN_REP_MODE_PINGPONG  = 0x02, ///<  Use
>>>> ping-pong loop mode, i.e. forward<->  backward
>>>> +};
>>>> +
>>>> +/** AVSequencerSample->env_usage_flags bitfield.  */
>>>> +enum AVSequencerSampleEnvUsageFlags {
>>>> +    AVSEQ_SAMPLE_FLAG_USE_AUTO_VIBRATO_ENV  = 0x01, ///<  Use
>>>> (reload) auto vibrato envelope
>>>> +    AVSEQ_SAMPLE_FLAG_USE_AUTO_TREMOLO_ENV  = 0x02, ///<  Use
>>>> (reload) auto tremolo envelope
>>>> +    AVSEQ_SAMPLE_FLAG_USE_AUTO_PANNOLO_ENV  = 0x04, ///<  Use
>>>> (reload) auto pannolo envelope
>>>> +};
>>>> +
>>>> +/** AVSequencerSample->env_proc_flags bitfield.  */
>>>> +enum AVSequencerSampleEnvProcFlags {
>>>> +    AVSEQ_SAMPLE_FLAG_PROC_AUTO_VIBRATO_ENV = 0x01, ///<  Add first,
>>>> then get auto vibrato envelope value
>>>> +    AVSEQ_SAMPLE_FLAG_PROC_AUTO_TREMOLO_ENV = 0x02, ///<  Add first,
>>>> then get auto tremolo envelope value
>>>> +    AVSEQ_SAMPLE_FLAG_PROC_AUTO_PANNOLO_ENV = 0x04, ///<  Add first,
>>>> then get auto pannolo envelope value
>>>> +    AVSEQ_SAMPLE_FLAG_PROC_LINEAR_AUTO_VIB  = 0x80, ///<  Use linear
>>>> frequency table for auto vibrato
>>>> +};
>>>> +
>>>> +/** AVSequencerSample->env_retrig_flags bitfield.  */
>>>> +enum AVSequencerSampleEnvRetrigFlags {
>>>> +    AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_VIBRATO_ENV   = 0x01, ///<  Not
>>>> retrigger auto vibrato envelope
>>>> +    AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_TREMOLO_ENV   = 0x02, ///<  Not
>>>> retrigger auto tremolo envelope
>>>> +    AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_PANNOLO_ENV   = 0x04, ///<  Not
>>>> retrigger auto pannolo envelope
>>>> +};
>>>> +
>>>> +/** AVSequencerSample->env_random_flags bitfield.  */
>>>> +enum AVSequencerSampleEnvRandomFlags {
>>>> +    AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_VIBRATO_ENV   = 0x01, ///<
>>>> Randomize auto vibrato envelope
>>>> +    AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_TREMOLO_ENV   = 0x02, ///<
>>>> Randomize auto tremolo envelope
>>>> +    AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_PANNOLO_ENV   = 0x04, ///<
>>>> Randomize auto pannolo envelope
>>>> +};
>>>> +
>>>> +/**
>>>> + * Sample structure used by all instruments which are either
>>>> + * have samples attached or are hybrids.
>>>> + * New fields can be added to the end with minor version bumps.
>>>> + * Removal, reordering and changes to existing fields require a major
>>>> + * version bump.
>>>> + */
>>>> +typedef struct AVSequencerSample {
>>>> +    /**
>>>> +     * information on struct for av_log
>>>> +     * - set by avseq_alloc_context
>>>> +     */
>>>> +    const AVClass *av_class;
>>>> +
>>>> +    /** Metadata information: Original sample file name, sample name,
>>>> +     *  artist and comment.  */
>>>> +    AVMetadata *metadata;
>>>> +
>>>> +    /** AVSequencerSynth pointer to synth sound structure or NULL
>>>> +       if this is neither a synth nor a hybrid.  */
>>>> +    AVSequencerSynth *synth;
>>>
>>>> +    /** Pointer to raw sample data, must be padded for
>>>> +       perfect perfomance gain when accessing sample data.
>>>
>>> ? Padded with how many bytes? What do you mean with "perfect
>>> performance gain"?
>>
>> As anything else in FFmpeg which is considered to be run by MMX/etc.
>> optimized code. Thought, that would be clear.
>
> Just request it to be aligned, should be enough.

Fixed.

>
>>>> +       This can be NULL in case if this is a MIDI instrument
>>>> +       or a synth sound instead.  */
>>>> +    int16_t *data;
>>>
>>>
>>>> +    /** Number of bytes the raw sample data occupies. 0 for
>>>> +       MIDI instruments and synth sounds.  */
>>>> +    uint32_t size;
>>>> +
>>>> +    /** Number of samples of the raw sample data or 0 for
>>>> +       MIDI instruments and synth sounds.  */
>>>> +    uint32_t samples;
>>>> +
>>>> +    /** Sample repeat starting loop point. If looping is enabled,
>>>> this
>>>> +       will be used as restart point.  */
>>>> +    uint32_t repeat;
>>>> +
>>>> +    /** Sample repeat length. End loop point is repeat + rep_len.  */
>>>> +    uint32_t rep_len;
>>>> +
>>>> +    /** Sample repeat count. Some sequencers allow to not only define
>>>> +       an infinite repeat count but specify that more precisely.
>>>> +       In that case, set this to a non zero value indicating the
>>>> +       number of loop counts.  */
>>>> +    uint32_t rep_count;
>>>> +
>>>> +    /** Sample sustain repeat starting loop point. If sustain
>>>> looping is
>>>> +       enabled, this will be used as sustain restart point.
>>>> +       Sustain loop is triggered by a note keyoff event.  */
>>>> +    uint32_t sustain_repeat;
>>>> +
>>>> +    /** Sample sustain repeat length. End sustain loop point is
>>>> +       sustain_repeat + sustain_rep_len.  */
>>>> +    uint32_t sustain_rep_len;
>>>> +
>>>> +    /** Sample sustain repeat count. Some sequencers allow to not
>>>> only
>>>> +       define an infinite sustain repeat count but specify that more
>>>> +       precisely. In that case, this has to be set to a non-zero
>>>> value
>>>> +       indicating the number of sustain loop counts.  */
>>>> +    uint32_t sustain_rep_count;
>>>> +
>>>> +    /** Sampling rate (frequency) in Hz to play C-4 at which defaults
>>>> +       to 8363 (NTSC base frequency used by 60Hz sequencers).  */
>>>> +    uint32_t rate;
>>>
>>>> +    /** Lower sample rate limit (the sample can never exceed this
>>>> +       minimum allowed frequency rate during playback).  */
>>>> +    uint32_t rate_min;
>>>> +
>>>> +    /** Upper sample rate limit (the sample can never exceed this
>>>> +       maximum allowed frequency rate during playback).  */
>>>> +    uint32_t rate_max;
>>>
>>> Where is this specified? Again, which code _reads_ this values?
>
>> Again, user and/or demuxer choosed values. See my details in song.[ch]
>> for this. This is either set by the demuxer and/or by the user if (s)he
>> wishes to restrict these values. Defaults are, anyway, no limits, i.e.
>> full 32-bit range.
>
> Is there any format that specifies such cutoff?

Original MOD does, and the player reads and enforces these values, this
also prevents vibratos and portamentos to go out of control. This is
not, however a hard specification in the sense that it's declared in the
file format description. It's just that I encountered modules which
won't playback correctly when this value is not i.e. set to 28375.

-- 

Best regards,
                   :-) Basty/CDGS (-:



More information about the FFmpeg-soc mailing list