Le 02/12/2014 15:21, Michael Niedermayer a écrit :
On Tue, Dec 02, 2014 at 08:44:02AM +0100, Benoit Fouet wrote:
Hi,

On December 1, 2014 11:34:44 PM GMT+01:00, Michael Niedermayer 
<michae...@gmx.at> wrote:
On Mon, Dec 01, 2014 at 11:41:41AM +0100, Benoit Fouet wrote:
---
Tested against all the materials I have at hand.
There is an artifact showing for
https://raw.githubusercontent.com/maxcom/lorsource/master/src/test/resources/images/i_want_to_be_a_hero__apng_animated__by_tamalesyatole-d5ht8eu.png
which I don't really understand, as it seems the individual frames
are correct
for our decoder, but the disposal that's done for other decoders
(tested
firefox and chrome) is not the same for the end of the cape.
---
  libavcodec/pngdec.c | 93
++++++++++++++++++++++++++++++++++++++++-------------
  1 file changed, 71 insertions(+), 22 deletions(-)

diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 9e52d0b..2ca3dee 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -23,6 +23,7 @@
#include "libavutil/bprint.h"
  #include "libavutil/imgutils.h"
+#include "libavutil/thread.h"
  #include "avcodec.h"
  #include "bytestream.h"
  #include "internal.h"
@@ -38,9 +39,16 @@ typedef struct PNGDecContext {
      AVCodecContext *avctx;
GetByteContext gb;
+    ThreadFrame previous_picture;
      ThreadFrame last_picture;
      ThreadFrame picture;
+#if CONFIG_APNG_DECODER
+    AVMutex mutex;
+    int frame_id;
+    int *pframe_id;
+#endif
why do you need a mutex ?

Actually, the only thing I need is the frame index. The best place for that 
would be in the demuxer, but I didn't find a place where this information is 
accessible. Did I miss something (I hope so)? Do you think I should be using 
side data for this?
To answer the question though, the access is done is all the decoder threads, 
so I did not want the reset to happen between the reading and the writing of 
the ++.
Thinking more about this, I think it's wrong anyway. I really need the demuxer 
to handle this, it would be simpler and more correct...
iam not sure i understand
considering a single threaded decoder it cannot change anything
for a past or future iteration (because these dont exist anymore or
yet) but only its own state now with a multi threaded decoder it gets
a copy of the previous
decoders state and changes its own state only, nothing else should
change its state so there should be no need for a mutex.

The (flawed) solution I used was to have in each context a pointer to the frame index of the first allocated one...

the thread for the next frame would not start before the current
is done with its basic setup of stuff like the frame index

the frame index for each frame is a copy of the last + 1

I'll try this simple approach. I just didn't quite look at how the threads were handled, but it seems that just incrementing the frame index unconditionnaly would be enough for my use case.

i assume theres enough information in the bitstream for the decoder
to know when to reset the index

yes

  and seeking if ts supported would
call avcodec_flush_buffers()

but quite possibly iam missing something

Doesn't seem so. That was me, just as I suspected...

--
Ben

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to