>      status = VTDecompressionSessionDecodeFrame(videotoolbox->session,
>                                                 sample_buf,
> -                                               0,       // decodeFlags
> +                                               decodeFlags,
>                                                 NULL,    // sourceFrameRefCon
>                                                 0);      // infoFlagsOut

Better keep tracking how many decoding samples,
that are passed in and not yet received in callback.

VideoToolbox doesn't limit the number of frames in callback thread in
async mode.
It could be out of memory soon on iPhone without limit, and sooner
when application is in background.

> @@ -586,6 +686,15 @@ static void videotoolbox_default_free(AVCodecContext 
> *avctx)
>         if (videotoolbox->cm_fmt_desc)
>             CFRelease(videotoolbox->cm_fmt_desc);
>
> +        if (videotoolbox->useAsyncDecoding) {
> +            
> VTDecompressionSessionWaitForAsynchronousFrames(videotoolbox->session);

I doubt if VTDecompressionSessionWaitForAsynchronousFrames guarantee
there are no more callback. Doc only says all samples are emitted.

Better wait all samples received in callback,
or add some check in callback to disable further access to context.

> +
> +            videotoolbox_clear_queue(videotoolbox);
> +
> +            if (videotoolbox->queue_mutex != NULL)
> +                videotoolbox_lock_operation(&videotoolbox->queue_mutex, 
> AV_LOCK_DESTROY);
> +        }
> +
>         if (videotoolbox->session)
>             VTDecompressionSessionInvalidate(videotoolbox->session);
>     }
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to