[Libav-user] How to allocate memory to store the image data (when use av_frame_alloc) ?

林其益 antony.lin at topviewcorp.com
Thu Feb 5 09:52:27 CET 2015


Dear Libav:

 

  Sorry for my poor english first.

 

  When using avcode_alloc_frame with avcodec_decode_video2 to decode h264
stream, I found out that the data pointer of AVFrame will change everytime i
decode a new frame.

So if i need to buffer the decoded frame, i must copy the image data to
other place (which allocate to store the image data).

 

Could I not to allocate memory to store the image data (decode frame),
because it will cost me 10 ms every frame ( 8 M resolution picture)?

 

If I just store the AVFrame 's data pointer for every frames, It only had
three sets of data pointer, so frames will be overwrite if you decode more
than three times before to use it (to display it on the screen).

Three sets of data pointer(3 frames buffer) is not enough for my implement
of buffering decoded frame, I want to buffer 10 frames (decode 10 frames
before to display it to the screen). Because I frame of H264 ( 8M
resolution) will recevie very slow  (more than 100 ms) and decode very slow
(more than 100 ms), so I need buffer 10 frames to let display the stream
smoothly.

 

My question is : 

  1. Could ffmpeg decode h264 use 10 sets of data pointer (not just three
sets of data pointer)?

  or 

  2. Could I allocate my own memory to the data[] array to AVFrame (not
allocate by the ffmpeg library)?

 

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///

example code is describe as follow:

/* c code bellow */

  AVFrame * pFrame;

  pFrame = avcode_alloc_frame();

  while (still_has_h264_frame)

  {

    avcodec_decode_video2(avctx, pFrame,....);

    printf(" data pointer of pFrame: %d %d %d \n", pFrame->data[0],
pFrame->data[1], pFrame->data[2]);

  }

 

/*  result print log */

 

data pointer of pFrame: 396361792 395445504 401670240

data pointer of pFrame: 405536832 402628512 402864768

data pointer of pFrame: 430506048 431489120 431725376

data pointer of pFrame: 396361792 395445504 401670240   <---  from here ,
the data point is the same as 1'th frame

data pointer of pFrame: 405536832 402628512 402864768   <---  from here ,
the data point is the same as 2'th frame

data pointer of pFrame: 430506048 431489120 431725376   <---  from here ,
the data point is the same as 3'th frame

......

 

Best Regards,

Antony Lin

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20150205/384b354c/attachment.html>


More information about the Libav-user mailing list