[FFmpeg-cvslog] r22119 - in trunk/libavutil: tree.c tree.h
Vitor Sessak
vitor1001
Tue Mar 2 19:18:09 CET 2010
Michael Niedermayer wrote:
> On Tue, Mar 02, 2010 at 06:40:03AM +0100, Vitor Sessak wrote:
>> Michael Niedermayer wrote:
>>> On Sun, Feb 28, 2010 at 09:48:42PM +0100, vitor wrote:
>>>> Author: vitor
>>>> Date: Sun Feb 28 21:48:42 2010
>>>> New Revision: 22119
>>>>
>>>> Log:
>>>> Implement av_tree_destroy_free_elem() to destroy a tree and free all the
>>>> values stored on it.
>>>>
>>>> Modified:
>>>> trunk/libavutil/tree.c
>>>> trunk/libavutil/tree.h
>>>>
>>>> Modified: trunk/libavutil/tree.c
>>>> ==============================================================================
>>>> --- trunk/libavutil/tree.c Sun Feb 28 20:58:26 2010 (r22118)
>>>> +++ trunk/libavutil/tree.c Sun Feb 28 21:48:42 2010 (r22119)
>>>> @@ -135,6 +135,15 @@ void av_tree_destroy(AVTreeNode *t){
>>>> }
>>>> }
>>>> +void av_tree_destroy_free_elem(AVTreeNode *t){
>>>> + if(t){
>>>> + av_tree_destroy_free_elem(t->child[0]);
>>>> + av_tree_destroy_free_elem(t->child[1]);
>>>> + av_free(t->elem);
>>>> + av_free(t);
>>>> + }
>>>> +}
>>>> +
>>>> #if 0
>>>> void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void
>>>> *opaque, void *elem), int (*enu)(void *opaque, void *elem)){
>>>> if(t){
>>>>
>>>> Modified: trunk/libavutil/tree.h
>>>> ==============================================================================
>>>> --- trunk/libavutil/tree.h Sun Feb 28 20:58:26 2010 (r22118)
>>>> +++ trunk/libavutil/tree.h Sun Feb 28 21:48:42 2010 (r22119)
>>>> @@ -78,5 +78,6 @@ void *av_tree_find(const struct AVTreeNo
>>>> */
>>>> void *av_tree_insert(struct AVTreeNode **rootp, void *key, int
>>>> (*cmp)(void *key, const void *b), struct AVTreeNode **next);
>>>> void av_tree_destroy(struct AVTreeNode *t);
>>>> +void av_tree_destroy_free_elem(struct AVTreeNode *t);
>>> argh, ive missed this part of your patch
>>> minor api bump & doxy missing and its the wrong way to do it
>>> you dont know at all if avfree() is correct and sufficient to free the
>>> opaque elements.
>>> av_tree_enumerate() is likely the correct way to free
>> Ok, but current version of av_tree_enumerate() is commented out and does
>> not do what one would expect. What do you think of this patch?
>>
>> -Vitor
>
>> libavformat/nut.c | 11 +++++++++++
>> libavformat/nut.h | 1 +
>> libavformat/nutdec.c | 1 +
>> libavformat/nutenc.c | 1 +
>> libavutil/avutil.h | 2 +-
>> libavutil/tree.c | 14 ++++++--------
>> libavutil/tree.h | 7 +++++++
>> 7 files changed, 28 insertions(+), 9 deletions(-)
>> 073f43adb2344cede149943eef2ce2cae50d7930 nuttree.diff
>> Index: libavutil/tree.c
>> ===================================================================
>> --- libavutil/tree.c (revision 22135)
>> +++ libavutil/tree.c (working copy)
>> @@ -135,16 +135,14 @@
>> }
>> }
>>
>> -#if 0
>
>
>> -void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, void *elem), int (*enu)(void *opaque, void *elem)){
>> - if(t){
>> - int v= cmp ? cmp(opaque, t->elem) : 0;
>> - if(v>=0) av_tree_enumerate(t->child[0], opaque, cmp, enu);
>> - if(v==0) enu(opaque, t->elem);
>> - if(v<=0) av_tree_enumerate(t->child[1], opaque, cmp, enu);
>> +void av_tree_enumerate(AVTreeNode *t, void *opaque,
>> + void (*enu)(void *opaque, void **elem)){
>> + if (t) {
>> + av_tree_enumerate(t->child[0], opaque, enu);
>> + enu(opaque, &t->elem);
>> + av_tree_enumerate(t->child[1], opaque, enu);
>> }
>
> no, this is broken
> the only question on the API i had IIRC was if we should allow elements
> to be removed based on the return code of enu()
> ruining the API by droping 2/3 of the features is not an option
Ok, so since there is no documentation for it, can you please explain me
what av_tree_enumerate() is supposed to do and in what way it is
different from
{
void *elem = av_tree_find(t, opaque, cmp, NULL);
if (elem)
enu(opaque, elem);
}
-Vitor
More information about the ffmpeg-cvslog
mailing list