[vlc-devel] [PATCH] picture: always copy context when cloning

Steve Lhomme robux4 at ycbcr.xyz
Fri Jul 31 09:04:10 CEST 2020


So I could use this patch right now to replace the nvdec (temporary) 
p_sys usage with an picture context init before putting the pictures in 
the pool.

So feel free to merge (or maybe I can put it in my picture cleanup branch).

On 2020-07-01 9:09, Steve Lhomme wrote:
> This could work but I'd prefer with an example of using this feature 
> (calling picture_pool_New() with pictures that already have a 
> picture_context_t) to see if it's going to lead to leaks of the 
> picture_pool. Right now the ref counting is done outside of the 
> picture_pool and the last clone released releases the pool.
> 
> On 2020-06-30 19:50, Alexandre Janniaux wrote:
>> picture_Clone was copying the original picture context into the new
>> clone while picture_pool_Clone wasn't. As it is possible to create a
>> pool from existing pictures, it's quite handy to be able to associate
>> the graphical resources needed for each picture to their context so
>> that it can be retrieved after a call to picture_pool_Wait/Get.
>>
>> The rationale is that because resources like pixels are shared between
>> the original picture and the clone, we should probably do the same with
>> picture_context and have a unified way for picture producer to
>> reference such resources.
>>
>> This patch remove the special handling in picture_Clone and move it to
>> picture_InternalClone for that reason.
>> ---
>>   src/misc/picture.c      | 11 +++++++----
>>   src/misc/picture_pool.c |  6 ++++--
>>   2 files changed, 11 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/misc/picture.c b/src/misc/picture.c
>> index e00b1303253..047d4d22477 100644
>> --- a/src/misc/picture.c
>> +++ b/src/misc/picture.c
>> @@ -440,18 +440,21 @@ picture_t *picture_InternalClone(picture_t 
>> *picture,
>>       picture_t *clone = picture_NewFromResource(&picture->format, &res);
>>       if (likely(clone != NULL)) {
>>           ((picture_priv_t *)clone)->gc.opaque = opaque;
>> +
>> +        /* The picture context is responsible for potentially holding 
>> the
>> +         * video context attached to the picture if needed. */
>> +        if (picture->context != NULL)
>> +            clone->context = picture->context->copy(picture->context);
>> +
>>           picture_Hold(picture);
>>       }
>> +
>>       return clone;
>>   }
>>   picture_t *picture_Clone(picture_t *picture)
>>   {
>>       picture_t *clone = picture_InternalClone(picture, 
>> picture_DestroyClone, picture);
>> -    if (likely(clone != NULL)) {
>> -        if (picture->context != NULL)
>> -            clone->context = picture->context->copy(picture->context);
>> -    }
>>       return clone;
>>   }
>> diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
>> index 5f0f41eba8e..1b979d5a23a 100644
>> --- a/src/misc/picture_pool.c
>> +++ b/src/misc/picture_pool.c
>> @@ -90,8 +90,10 @@ static picture_t 
>> *picture_pool_ClonePicture(picture_pool_t *pool,
>>       picture_t *picture = pool->picture[offset];
>>       uintptr_t sys = ((uintptr_t)pool) + offset;
>> -    return picture_InternalClone(picture, picture_pool_ReleasePicture,
>> -                                 (void*)sys);
>> +    picture_t *clone = picture_InternalClone(picture,
>> +                                             
>> picture_pool_ReleasePicture,
>> +                                             (void*)sys);
>> +    return clone;
>>   }
>>   picture_pool_t *picture_pool_New(unsigned count, picture_t *const *tab)
>> -- 
>> 2.27.0
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>>


More information about the vlc-devel mailing list