[FFmpeg-soc] [soc] libavsequencer [PATCH 03/08] Order list public API header file.
Vitor Sessak
vitor1001 at gmail.com
Tue Jul 13 12:20:45 CEST 2010
On 07/11/2010 10:05 PM, Sebastian Vater wrote:
> Vitor Sessak a écrit :
>> On 07/10/2010 11:24 PM, Sebastian Vater wrote:
>>> Vitor Sessak a écrit :
>>>> On 07/10/2010 08:02 PM, Sebastian Vater wrote:
>>>>> Vitor Sessak a écrit :
>>>>>> On 07/07/2010 10:47 PM, Sebastian Vater wrote:
>>>>>>> diff --git a/libavsequencer/order.h b/libavsequencer/order.h
>>>>>>> new file mode 100644
>>>>>>> index 0000000..ac48db2
>>>>>>> --- /dev/null
>>>>>>> +++ b/libavsequencer/order.h
>>>>>>> +typedef struct AVSequencerOrderList {
>>>>>>> + /** Integer indexed tree root of order list data used by this
>>>>>>> + channel with AVTreeNode->elem being an
>>>>>>> AVSequencerOrderData. */
>>>>>>> + AVTreeNode *order_data;
>>>>>>> +
>>>>>>> + /** Number of order list data entries to use for this
>>>>>>> channel. */
>>>>>>> + uint16_t length;
>>>>>>> +
>>>>>>> + /** Repeat start order list data number for this channel. */
>>>>>>> + uint16_t rep_start;
>>>>>>> +
>>>>>>> + /** Volume level for this channel (defaults to 255). */
>>>>>>> + uint8_t volume;
>>>>>>> +#define AVSEQ_ORDER_LIST_VOLUME 255
>>>>>>> +
>>>>>>> + /** Sub-volume level for this channel. This is basically
>>>>>>> channel
>>>>>>> + volume divided by 256, but the sub-volume doesn't account
>>>>>>> + into actual mixer output (defaults 0). */
>>>>>>> + uint8_t sub_volume;
>>>>>>> +#define AVSEQ_ORDER_LIST_SUB_VOLUME 0
>>>>>>
>>>>>> Dividing an uint_8 by 256? Does not give much information...
>>>>>
>>>>> Dividing (volume<< 8) + sub_volume by 256. I mean with that the
>>>>> sub_volume is internally used for accuracy sliding but not
>>>>> outputted to
>>>>> the mixing engine.
>>>>
>>>> Why don't you have just a single var for (volume<< 8) + subvolume?
>>>
>>> I already thought quite a long time about this, long before starting
>>> GSoC. But then I noticed that I mostly access only volume without
>>> sub-volume. Sub-volume is practically only used for the volume slide
>>> commands, etc.
>>>
>>> For the rest, I just access the 8-bit volume value. Maybe an union would
>>> be an alternative idea? But that probably looks more ugly can current
>>> implementation.
>>>
>>> Anyway there is no actual reason, why the sub-volume slides couldn't
>>> take in to account into actual output (it would make volume depth 16-bit
>>> and therefore much smoother like switching from 8-bit sample to 16-bit),
>>> since sub-slides are an unique feature of TuComposer so far which I
>>> invented because TuComposer uses 16-bit data for the effects instead of
>>> just 8-bit ones.
>>>
>>> But it would require a lot of changes (esp. in the playback engine),
>>> which I would prefer doing after GSoC when we have everything ready so
>>> that FFmpeg can actually play and convert mod files already.
>>
>> So subvolume is not actually needed to describe a song?
>>
>>> Changing the internal logic of the playback engine will require testing
>>> it, which is not possible at the current state, I just want to get it
>>> working at all, i.e. at least having the same audio output as TuComposer
>>> had.
>>
>> I agree of letting it as-is for now.
>>
>
> New patch attached.
> /*
> * AVSequencer order list and data 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_ORDER_H
> #define AVSEQUENCER_ORDER_H
>
> #include "libavsequencer/track.h"
>
> /**
> * Song order list structure, This structure is actually for one channel
> * and therefore actually pointed as an array with size of number of
> * host channels.
Wouldn't it be better named AVSequencerChannelData?
> * 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 AVSequencerOrderList {
> /** Array of pointers containing all order list data used by this
> channel. */
> AVSequencerOrderData **order_data;
Please replace in the comment "order list data" for a brief description
of what it means. And BTW, is this an "order _list_ data"?
> /** Number of order list data used for this channel. */
> uint16_t orders;
>
> /** Number of order list data entries to use for this channel. */
> uint16_t length;
>
> /** Repeat start order list data number for this channel. */
> uint16_t rep_start;
>
> /** Volume level for this channel (defaults to 255). */
> uint8_t volume;
> #define AVSEQ_ORDER_LIST_VOLUME 255
>
> /** Sub-volume level for this channel. This is basically channel
> volume divided by 256, but the sub-volume doesn't account
> into actual mixer output (defaults 0). */
> uint8_t sub_volume;
> #define AVSEQ_ORDER_LIST_SUB_VOLUME 0
>
> /** Stereo track panning level for this channel (defaults to
> -128 = central stereo track panning). */
> int8_t track_panning;
> #define AVSEQ_ORDER_LIST_TRACK_PAN -128
>
> /** Stereo track sub-panning level for this channel. This is
> basically track panning divided by 256, but the sub-panning
> doesn't account into actual mixer output (defaults 0). */
> uint8_t track_sub_panning;
> #define AVSEQ_ORDER_LIST_TRACK_SUB_PAN -128
>
> /** Stereo panning level for this channel (defaults to
> -128 = central stereo panning). */
> int8_t channel_panning;
> #define AVSEQ_ORDER_LIST_PANNING -128
>
> /** Stereo sub-panning level for this channel. This is
> basically channel panning divided by 256, but the sub-panning
> doesn't account into actual mixer output (defaults 0). */
> uint8_t channel_sub_panning;
> #define AVSEQ_ORDER_LIST_SUB_PANNING 0
> /** Compatibility flags for playback. There are rare cases
> where order handling can not be mapped into internal
> playback engine and have to be handled specially. For
> each order list which needs this, this will define new
> flags which tag the player to handle it to that special
> way. */
> uint8_t compat_flags;
I suppose this is not unused ATM?
> /** Order list playback flags. Some sequencers feature
> surround panning or allow initial muting. which has to
> be taken care specially in the internal playback engine.
> Also sequencers differ in how they handle slides. */
> uint8_t flags;
> #define AVSEQ_ORDER_LIST_FLAG_CHANNEL_SURROUND 0x01 ///< Initial channel surround instead of stereo panning
> #define AVSEQ_ORDER_LIST_FLAG_TRACK_SURROUND 0x02 ///< Initial track surround instead of stereo panning
> #define AVSEQ_ORDER_LIST_FLAG_MUTED 0x04 ///< Initial muted channel
>
> } AVSequencerOrderList;
>
> /**
> * Song order list data structure, this contains actual order list data.
> * 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 AVSequencerOrderData {
> /** AVSequencerTrack pointer to track which should be played. */
> AVSequencerTrack *track;
> /** Next order list data pointer if seeking forward one frame. */
> AVSequencerOrderData *next_pos;
>
> /** Previous order list data pointer if seeking backward one
> frame. */
> AVSequencerOrderData *prev_pos;
These do not look to belong to the BSS.
> /** Number of row to jump to if forward seeking one frame. */
> uint16_t next_row;
>
> /** Number of row to jump to if backward seeking one frame. */
> uint16_t prev_row;
>
> /** Beginning row for this track. If this is a track synchronization
> point, the high byte is interpreted as the first track number
> to be synchronized with and the low byte as the second track
> number or for all channels when all 4 tracks are 0. */
> uint16_t first_row;
>
> /** Last row for this track. If this is a track synchronization
> point, the high byte is interpreted as the third track number
> to be synchronized with and the low byte as the fourth track
> number or for all channels when all 4 tracks are 0.
> If last row is set to 65535 in non synchronization mode,
> the last row is always taken from AVSequencerTrack. */
> uint16_t last_row;
>
> /** Order list data playback flags. Some sequencers feature
> special end markers or even different playback routes for
> different playback modules (one-shot and repeat mode
> playback), mark synchronization points or temporary
> change volume), which has to be taken care specially
> in the internal playback engine. */
> uint8_t flags;
> #define AVSEQ_ORDER_DATA_FLAG_END_ORDER 0x01 ///< Order data indicates end of order
> #define AVSEQ_ORDER_DATA_FLAG_END_SONG 0x02 ///< Order data indicates end of whole song
> #define AVSEQ_ORDER_DATA_FLAG_NOT_IN_ONCE 0x04 ///< Order data will be skipped if you're playing in one-time mode
> #define AVSEQ_ORDER_DATA_FLAG_NOT_IN_REPEAT 0x08 ///< Order data will be skipped if you're playing in repeat mode
> #define AVSEQ_ORDER_DATA_FLAG_TRACK_SYNC 0x10 ///< Order data is a track synchronization point.
> #define AVSEQ_ORDER_DATA_FLAG_SET_VOLUME 0x20 ///< Order data takes advantage of the order list volume set
>
> /** Relative note transpose for full track. Allows playing several
> tracks some half-tones up/down. */
> int8_t transpose;
>
> /** Instrument transpose. All instruments will be relatively
> mapped to this if this is non-zero. */
> int16_t instr_transpose;
> /** Tempo change or zero to skip tempo change. */
> uint16_t tempo;
Cryptic comment. This is the timestamp where the tempo change? An index
to a list a tempo changing structures? The instrument number that has a
different tempo?
> /** Played nesting level (GoSub command maximum nesting depth). */
> uint16_t played;
Again, BSS?
> /** Track volume (this overrides settings in AVSequencerTrack).
> To enable this, the flag AVSEQ_ORDER_DATA_FLAG_SET_VOLUME
> must be set in flags. */
> uint8_t volume;
This is ugly, why not making it a signed int and summing it to
AVSequencerTrack.volume no matter what?
-Vitor
More information about the FFmpeg-soc
mailing list