diff mbox

[FFmpeg-devel,1/7] avcodec/mediacodec: convert to stdatomic

Message ID CAOmVQXHi7UP_ZAGzkWCX-iOxoTUCc_SRkmvFj2TcdCiSnZtw1A@mail.gmail.com
State Accepted
Headers show

Commit Message

Matthieu Bouron March 23, 2017, 6:15 p.m. UTC
Le 23 mars 2017 12:35 AM, "James Almer" <jamrial@gmail.com> a écrit :

Signed-off-by: James Almer <jamrial@gmail.com>
---
Untested.

 libavcodec/mediacodec.c           |  5 ++---
 libavcodec/mediacodecdec.c        |  1 -
 libavcodec/mediacodecdec_common.c | 14 ++++++--------
 libavcodec/mediacodecdec_common.h |  5 +++--
 4 files changed, 11 insertions(+), 14 deletions(-)


The underlying buffer is meant to be released once. Unless i miss something
there, you could potentially release a later buffer using the same index or
release an invalid buffer. A mediacodec buffer can only be released once.
Once it is released it goes back to the decoder pool and it is not usable
anymore unless it bas been returned by the decoder again. The buffer itself
is represented by an index. Can you bring the original check back ?
(released == 1)

I dont have the time to review and test the entire patch (nor the machine,
i m writing from my phone) as i am on holidays but i ll be back on monday
(and i ll test the patch).

Matthieu
[...]

Comments

James Almer March 23, 2017, 6:30 p.m. UTC | #1
On 3/23/2017 3:15 PM, Matthieu Bouron wrote:
> Le 23 mars 2017 12:35 AM, "James Almer" <jamrial@gmail.com> a écrit :
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> Untested.
> 
>  libavcodec/mediacodec.c           |  5 ++---
>  libavcodec/mediacodecdec.c        |  1 -
>  libavcodec/mediacodecdec_common.c | 14 ++++++--------
>  libavcodec/mediacodecdec_common.h |  5 +++--
>  4 files changed, 11 insertions(+), 14 deletions(-)
> 
> diff --git a/libavcodec/mediacodec.c b/libavcodec/mediacodec.c
> index 4ad5921bc2..91f725621d 100644
> --- a/libavcodec/mediacodec.c
> +++ b/libavcodec/mediacodec.c
> @@ -31,7 +31,6 @@
>  #include <jni.h>
> 
>  #include "libavcodec/avcodec.h"
> -#include "libavutil/atomic.h"
>  #include "libavutil/mem.h"
> 
>  #include "ffjni.h"
> @@ -90,9 +89,9 @@ void av_mediacodec_default_free(AVCodecContext *avctx)
>  int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render)
>  {
>      MediaCodecDecContext *ctx = buffer->ctx;
> -    int released = avpriv_atomic_int_add_and_fetch(&buffer->released, 1);
> +    atomic_int released = atomic_fetch_add(&buffer->released, 1);
> 
> -    if (released == 1) {
> +    if (!released) {
> 
> 
> Hello,
> 
> The underlying buffer is meant to be released once. Unless i miss something
> there, you could potentially release a later buffer using the same index or
> release an invalid buffer. A mediacodec buffer can only be released once.
> Once it is released it goes back to the decoder pool and it is not usable
> anymore unless it bas been returned by the decoder again. The buffer itself
> is represented by an index. Can you bring the original check back ?
> (released == 1)

C11 atomics only has fetch_add functions, not add_fetch like the previous
implementation.

add_fetch(&dst, 1) adds 1 to dst, then returns the new dst value.
fetch_add(&dst, 1) adds 1 to dst, then returns the old dst value.

This means that for us to check if the buffer was released once, while for
add_fetch we had to check if the return value was 1, for fetch_add we need
to check if it's zero.

> 
> I dont have the time to review and test the entire patch (nor the machine,
> i m writing from my phone) as i am on holidays but i ll be back on monday
> (and i ll test the patch).
> 
> Matthieu
> [...]
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
Matthieu Bouron March 24, 2017, 11:54 a.m. UTC | #2
Le 23 mars 2017 7:31 PM, "James Almer" <jamrial@gmail.com> a écrit :

On 3/23/2017 3:15 PM, Matthieu Bouron wrote:
> Le 23 mars 2017 12:35 AM, "James Almer" <jamrial@gmail.com> a écrit :
>
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> Untested.
>
>  libavcodec/mediacodec.c           |  5 ++---
>  libavcodec/mediacodecdec.c        |  1 -
>  libavcodec/mediacodecdec_common.c | 14 ++++++--------
>  libavcodec/mediacodecdec_common.h |  5 +++--
>  4 files changed, 11 insertions(+), 14 deletions(-)
>
> diff --git a/libavcodec/mediacodec.c b/libavcodec/mediacodec.c
> index 4ad5921bc2..91f725621d 100644
> --- a/libavcodec/mediacodec.c
> +++ b/libavcodec/mediacodec.c
> @@ -31,7 +31,6 @@
>  #include <jni.h>
>
>  #include "libavcodec/avcodec.h"
> -#include "libavutil/atomic.h"
>  #include "libavutil/mem.h"
>
>  #include "ffjni.h"
> @@ -90,9 +89,9 @@ void av_mediacodec_default_free(AVCodecContext *avctx)
>  int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render)
>  {
>      MediaCodecDecContext *ctx = buffer->ctx;
> -    int released = avpriv_atomic_int_add_and_fetch(&buffer->released, 1);
> +    atomic_int released = atomic_fetch_add(&buffer->released, 1);
>
> -    if (released == 1) {
> +    if (!released) {
>
>
> Hello,
>
> The underlying buffer is meant to be released once. Unless i miss
something
> there, you could potentially release a later buffer using the same index
or
> release an invalid buffer. A mediacodec buffer can only be released once.
> Once it is released it goes back to the decoder pool and it is not usable
> anymore unless it bas been returned by the decoder again. The buffer
itself
> is represented by an index. Can you bring the original check back ?
> (released == 1)

C11 atomics only has fetch_add functions, not add_fetch like the previous
implementation.

add_fetch(&dst, 1) adds 1 to dst, then returns the new dst value.
fetch_add(&dst, 1) adds 1 to dst, then returns the old dst value.

This means that for us to check if the buffer was released once, while for
add_fetch we had to check if the return value was 1, for fetch_add we need
to check if it's zero.


Thanks for the explanation and for the patch (and sorry for the noise).

Matthieu

[...]
diff mbox

Patch

diff --git a/libavcodec/mediacodec.c b/libavcodec/mediacodec.c
index 4ad5921bc2..91f725621d 100644
--- a/libavcodec/mediacodec.c
+++ b/libavcodec/mediacodec.c
@@ -31,7 +31,6 @@ 
 #include <jni.h>

 #include "libavcodec/avcodec.h"
-#include "libavutil/atomic.h"
 #include "libavutil/mem.h"

 #include "ffjni.h"
@@ -90,9 +89,9 @@  void av_mediacodec_default_free(AVCodecContext *avctx)
 int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render)
 {
     MediaCodecDecContext *ctx = buffer->ctx;
-    int released = avpriv_atomic_int_add_and_fetch(&buffer->released, 1);
+    atomic_int released = atomic_fetch_add(&buffer->released, 1);

-    if (released == 1) {
+    if (!released) {


Hello,