[FFmpeg-soc] [soc] libavsequencer [PATCH 04/08] Track / pattern handling public API header file.

Vitor Sessak vitor1001 at gmail.com
Sat Aug 14 01:06:43 CEST 2010


On 08/13/2010 10:28 PM, Sebastian Vater wrote:
> Vitor Sessak a écrit :
>> On 08/07/2010 09:46 PM, Sebastian Vater wrote:
>>> Vitor Sessak a écrit :
>>>> On 07/13/2010 10:57 PM, Sebastian Vater wrote:
>>>>> Vitor Sessak a écrit :
>>>>>> On 07/13/2010 09:35 PM, Sebastian Vater wrote:
>>>>>>> Vitor Sessak a écrit :
>>>>>>>> On 07/11/2010 10:07 PM, Sebastian Vater wrote:
>>>>>>>>> typedef struct AVSequencerTrackData {
>>
>> [...]
>>
>>>>>>>> if (instrument == previous_instrument) {...}
>>>>>>>
>>>>>>> Please note that instrument number 0 also differs whether you
>>>>>>> play the
>>>>>>> track in once mode (pattern play mode) and the instrument number was
>>>>>>> initialized in the previous order. All trackers don't output
>>>>>>> sound in
>>>>>>> that case, changing this would make this part incompatible.
>>>>>>
>>>>>> That's another good point, so I'm fine with instrument==0 meaning
>>>>>> last
>>>>>> instrument. But if the behavior of setting instrument==0 is different
>>>>>> of the behavior of setting instrument==last_instrument, it should be
>>>>>> documented somewhere.
>>>>>
>>>>>>> TrackData is the octave, note, effect and effect data for each row,
>>>>>>> Track itself defines the structure containing it, i.e. number of
>>>>>>> rows,
>>>>>>> maybe track name, etc.
>>>>>>
>>>>>> Maybe AVSequencerRowData then?
>>>>>
>>>>> Nice name, will think on it!
>>
>> So?
>
> AVSequencerTrackRow?
>
> Just to make the hierarchy clearer...agree on this?

yes.

>>>>>>>
>>>>>>> This would require extending using 0x80-0xFF command effect which
>>>>>>> would
>>>>>>> conflict with synth sound handling (see there at the synth sound
>>>>>>> instructions).
>>>>>>
>>>>>> Ok, let me pose the question differently. Suppose we have an effect
>>>>>> foo. In MOD, effect foo is command 0x66 while in XM it is command
>>>>>> 0x55. What is the value of AVSEQ_TRACK_EFFECT_CMD_FOO? Or such thing
>>>>>> never happens?
>>>>>
>>>>> This happens very frequently, esp. between MOD/XM<=>    S3M/IT.
>>>>> But this is part of the demuxer to convert the origins...
>>>>
>>>> Sure, but then doing as you do:
>>>>
>>>>       /** 0x66 - Do foo to stuff */
>>>>        #define AVSEQ_TRACK_EFFECT_CMD_FOO 0x66
>>>>
>>>> is confusing and misleading in comparison with
>>>>
>>>>       /** Do foo to stuff */
>>>>        #define AVSEQ_TRACK_EFFECT_CMD_FOO 0x66
>>
>> So?
>
> Sorry, don't understand here, what you mean.

I mean that if the choice of 0x66 for AVSEQ_TRACK_EFFECT_CMD_FOO is 
merely a convention, it should not be reinforced in the comment.

>>> diff --git a/libavsequencer/track.h b/libavsequencer/track.h
>>> new file mode 100755
>>> index 0000000..cf131af
>>> --- /dev/null
>>> +++ b/libavsequencer/track.h
>>> @@ -0,0 +1,1636 @@
>>> +/*
>>> + * AVSequencer track and pattern 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_TRACK_H
>>> +#define AVSEQUENCER_TRACK_H
>>> +
>>> +#include "libavutil/log.h"
>>> +#include "libavformat/avformat.h"
>>> +
>>
>>
>>> +/**
>>> + * Song track effect structure, This structure is actually for one row
>>> + * and therefore actually pointed as an array with the amount of
>>> + * rows of the whole track.
>>> + * 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 AVSequencerTrackEffect {
>>> +    /** Effect command byte.  */
>>> +    uint8_t command;
>>
>> enum...
>
> Again where's the problem? enums are all above.
>
>>
>>> +    /** Effect command data word.  */
>>> +    uint16_t data;
>>> +} AVSequencerTrackEffect;
>>> +
>>> +/** AVSequencerTrackEffect->note values.  */
>>> +enum AVSequencerTrackDataNote {
>>> +    /** ---  */
>>> +    AVSEQ_TRACK_DATA_NOTE_NONE          = 0,
>>> +
>>> +    /** C-n  */
>>> +    AVSEQ_TRACK_DATA_NOTE_C             = 1,
>>> +
>>> +    /** C#n = Dbn  */
>>> +    AVSEQ_TRACK_DATA_NOTE_C_SHARP       = 2,
>>> +
>>> +    /** D-n  */
>>> +    AVSEQ_TRACK_DATA_NOTE_D             = 3,
>>> +
>>> +    /** D#n = Ebn  */
>>> +    AVSEQ_TRACK_DATA_NOTE_D_SHARP       = 4,
>>> +
>>> +    /** E-n  */
>>> +    AVSEQ_TRACK_DATA_NOTE_E             = 5,
>>> +
>>> +    /** F-n  */
>>> +    AVSEQ_TRACK_DATA_NOTE_F             = 6,
>>> +
>>> +    /** F#n = Gbn  */
>>> +    AVSEQ_TRACK_DATA_NOTE_F_SHARP       = 7,
>>> +
>>> +    /** G-n  */
>>> +    AVSEQ_TRACK_DATA_NOTE_G             = 8,
>>> +
>>> +    /** G#n = Abn  */
>>> +    AVSEQ_TRACK_DATA_NOTE_G_SHARP       = 9,
>>> +
>>> +    /** A-n  */
>>> +    AVSEQ_TRACK_DATA_NOTE_A             = 10,
>>> +
>>> +    /** A#n = Bbn  */
>>> +    AVSEQ_TRACK_DATA_NOTE_A_SHARP       = 11,
>>> +
>>> +    /** B-n = H-n  */
>>> +    AVSEQ_TRACK_DATA_NOTE_B             = 12,
>>> +
>>> +    /** ^^^ = note kill  */
>>> +    AVSEQ_TRACK_DATA_NOTE_KILL          = -1,
>>> +
>>> +    /** ^^- = note off  */
>>> +    AVSEQ_TRACK_DATA_NOTE_OFF           = -2,
>>> +
>>> +    /** === = keyoff note  */
>>> +    AVSEQ_TRACK_DATA_NOTE_KEYOFF        = -3,
>>> +
>>> +    /** -|- = hold delay  */
>>> +    AVSEQ_TRACK_DATA_NOTE_HOLD_DELAY    = -4,
>>> +
>>> +    /** -\- = note fade  */
>>> +    AVSEQ_TRACK_DATA_NOTE_FADE          = -5,
>>> +
>>> +    /** END = pattern end marker  */
>>> +    AVSEQ_TRACK_DATA_NOTE_END           = -16,
>>> +};
>>
>> Why hardcoding values? Why not just use:
>>
>> /** AVSequencerTrackEffect->note values.  */
>> enum AVSequencerTrackDataNote {
>>      /** ---  */
>>      AVSEQ_TRACK_DATA_NOTE_NONE,
>>
>>      /** C-n  */
>>      AVSEQ_TRACK_DATA_NOTE_C,
>>
>>      /** C#n = Dbn  */
>>      AVSEQ_TRACK_DATA_NOTE_C_SHARP,
>>
>>      [...]
>> }
>>
>> And let the compiler assign whatever numbers it seems fit?
>
> Would require every demuxer/muxer to convert these values if they don't
> match,

Every format uses the same convention?

-Vitor


More information about the FFmpeg-soc mailing list