[FFmpeg-devel] v4l2: bug #1570 and possible solution
Michael Niedermayer
michaelni at gmx.at
Tue Feb 12 18:20:12 CET 2013
On Tue, Feb 12, 2013 at 06:01:10PM +0100, Giorgio Vazzana wrote:
> 2013/2/12 Michael Niedermayer <michaelni at gmx.at>:
> > On Tue, Feb 12, 2013 at 12:40:21PM +0100, Giorgio Vazzana wrote:
> >> 2013/2/12 Michael Niedermayer <michaelni at gmx.at>:
> >> +static void mmap_release_buffer(AVPacket *pkt)
> >> +{
> >> + struct buff_data *buf_descriptor = pkt->priv;
> >> +
> >> + if (pkt->data == NULL)
> >> + return;
> >> +
> >> + if (buf_descriptor->buffer_copied) {
> >> + av_free(pkt->data);
> >> + } else {
> >> + if (!enqueue_buffer(buf_descriptor->fd, buf_descriptor->index))
> >
> >> + (*buf_descriptor->buffers_dequeued)--;
> >
> > the deallocation of packets could happen from different thread(s)
> > so i think this needs either a mutex, an atomic decrement or some
> > lockless algorithm to achive the same
>
> Ok, I've tried to implement the solution using the mutex. Please comment.
>
> We can use this approach, or the easiest (and slightly slower?)
> solution would be copying every frame/buffer to the memory allocated
> for the corresponding packet.
if you want to avoid the dependancy on pthreads, one way that should
work is to use an array which size matches the maximum number of
buffers, inited to 0 each time a buffer is allocated its entry is set
to 1, when its freed its set to 0. to find out how many buffers are
left the whole array would need to be scanned and remaining 0 elements
counted.
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I know you won't believe me, but the highest form of Human Excellence is
to question oneself and others. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130212/910800f3/attachment.asc>
More information about the ffmpeg-devel
mailing list