[FFmpeg-devel] [RFC] Avoid av_read_frame memory copy in implementation
Cyril Russo
stage.nexvision
Fri May 28 09:13:50 CEST 2010
>> Currently, I'm using
>> threads, and I have to copy packet because if I don't, it crashes while
>> decoding.
>>
> ffplay uses threads, it does not always copy and it doesnt crash
>
This is wrong. ffplay "av_dup" each packet (except special "flush
packets"). Please check the first 2 lines of packet_queue_put.
Remove that part and it crashes.
Any code not using the packet immediately must do it, since calling
again av_read_frame can destroy the previous returned packet's data.
Currently it's:
1) av_read_frame allocates/reuse its packet buffer (the documentation
says so, and my tests confirms this)
2) av_read_frame demux in the allocated packet
3) return packet to the user code
4) malloc packet data in user code
5) copy first packet data in the malloced area in user code
What I think would be better:
1) av_read_frame calls user function to get a buffer (instead of reusing it)
2) av_read_frame demux in the allocated buffer
3) return packet to the user code
>
>
>> If I had my own allocate_packet function in the context, then I would
>> probably allocate them in a thread's specific buffer.
>> The default function could simply act like it does currently (we would keep
>> the "returned packet is valid until next av_read_frame" part, but add
>> "unless you provide your own allocate_packet function").
>>
> you dont seem to understand the problem at all or i dont understand you.
>
>
What I want is simple, I want to avoid the player to copy the stream
twice in memory.
Currently, you can't store a read packet for later decoding, unless you
dup' it.
To change this, av_read_frame semantic should be changed, either by
writing another function or by implementing a function pointer for
packet allocation so av_read_frame can't reuse a packet buffer.
The former is a pain for users, they'll need to update their code, the
latter seems more like it's already done (and packet already have a
"destruct" function pointer).
I don't know which is best, or if the solution worth it at all, hence
the RFC.
Regards,
Cyril
More information about the ffmpeg-devel
mailing list