Как предварительно выделить память для libavcodec для записи данных декодированного кадра? - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь декодировать видео с помощью libav, следуя демонстрационному коду: здесь

Мне нужно иметь возможность контролировать, где хранятся данные кадра в pFrame->data[0].Я попытался установить pFrame->data для моего собственного буфера следующим образом:

// Determine required buffer size and allocate buffer 
int numBytes = av_image_get_buffer_size(pixFmt, width, height, 1); 
(uint8_t*) dataBuff = (uint8_t*) malloc (numBytes * sizeof(uint8_t)); 

// Assign buffer to image planes in pFrame
av_image_fill_arrays(frame->data, frame->linesize, dataBuff, pixFmt, width,
height, 1);

В то время как pFrame->data устанавливает dataBuff (если я печатаю их адреса, они совпадают), этот вызовret = avcodec_receive_frame(pCodecContext, pFrame) для получения декодированных данных всегда записывает данные на другой адрес.Кажется, он управляет собственной памятью где-то в базовом API и игнорирует dataBuff, который я назначил pFrame прямо перед этим.

Так что я застрял - как я могу сказать libav написатьдекодированные данные кадра в память, которую я предварительно выделил?Я видел, как люди задают подобные вопросы онлайн и на форуме libav, но не смогли найти ответ.

Большое спасибо ~

1 Ответ

0 голосов
/ 18 декабря 2018

Я обнаружил, что правильный способ сделать это - использовать функцию обратного вызова get_buffer2, чтобы создать свой собственный распределитель, поскольку этот ответ демонстрирует:

FFMPEG: при декодировании видео можно генерироватьрезультат для предоставленного пользователем буфера?

Дополнительная документация здесь !

...