2013-12-04 5 views
0

Я изменяю код видеодекодера с FFMPEG. Декодированный код имеет формат YUV420. У меня 3 указатели, каждый из которых указывает на Y, U и V т.е. данных:FFMPEG: отображение данных YUV на выходной буфер функции декодирования

yPtr-> is a pointer pointing to the Luma 
uPtr-> is a pointer pointing to the Chroma Cb 
vPtr-> is a pointer pointing to the Chroma Cr 

Однако выходной указатель на который мне нужно сопоставить мои данные YUV имеет тип пустоты. И указатель вывода - один.

i.e: void *data - указатель на выход, для которого мне нужно указать мой yPtr, uPtr and vPtr. Как мне это сделать?

Один из подходов, который я пробовал, создал новый буфер, размер которого равен сумме данных Y, U и V, и скопируйте содержимое yPtr, uPtr и vPtr в новый выделенный буфер, а указатель на этот буфер я выделяю *data вывод указателя.

Однако этот подход не является предпочтительным, поскольку memcpy необходимо выполнить и другие недостатки производительности.

Может кто-нибудь предложить альтернативу для этой проблемы. Это может быть не связано непосредственно с FFMPEG, но поскольку я изменяю код декодера libvcodec FFMPEG, я помещаю его в FFMPEG.

Edit: То, что я пытаюсь сделать:

На самом деле мое понимание, если я сделаю эту точку указателя на void *data указатель любого декодирования функции любого декодера и установки *got_frame_ptr к 1, то структура будет принимать заботиться о том, чтобы сбросить эти данные в файл yuv. правильно ли мое понимание?

Прототип функции моего пользовательского видео декодера или любого видеодекодер в FFmpeg является, как показано ниже:

static int myCustomDec_decode_frame(AVCodecContext *avctx, 
      void *data, int *data_size, 
      uint8_t *buf, int buf_size) { 

Я имею в виду этот пост FFMPEG: Explain parameters of any codecs function pointers и предполагая, что мне нужно указать * данные на мой YUV указатель данных и демпинговый материал будут учтены ffmpeg. Просьба представить предложения, исправляющие то же самое.

ответ

2

Вы делаете что-то неправильно. Вы не объясняете, почему вам нужно отображать плоскости на один указатель. Что вы пытаетесь сделать, делая это, потому что это не повод для этого. Вы пытаетесь преобразовать из строгального станка в формат без строчки (например, YUYV или RGB)? Если это так, это сложнее, чем memcpy, байты должны чередоваться. Вы можете сделать это с помощью libswscale.

Update:

Во-первых, ваш прототип является неправильным. Правильный.

static int cook_decode_frame(AVCodecContext *avctx, void *data, 
          int *got_frame_ptr, AVPacket *avpkt) 

Это ответ на вопрос, который вы связали. Затем данные void * указывают на AVFrame.

static int decode_frame(AVCodecContext *avctx, void *data, 
         int *got_frame, AVPacket *avpkt) 
{ 
    ... 
    AVFrame *pict  = data; 
    ... 
} 

И vorbiddec.c

static int vorbis_decode_frame(AVCodecContext *avctx, void *data, 
           int *got_frame_ptr, AVPacket *avpkt) 
{ 
    ... 
    AVFrame *frame  = data; 
    ... 
} 

И пример связывал вопрос, который вы ссылаетесь.

static int cook_decode_frame(AVCodecContext *avctx, void *data, 
          int *got_frame_ptr, AVPacket *avpkt) 
{ 
     AVFrame *frame  = data; 
... 
} 
+0

Спасибо за ответ.Но причина, по которой я делаю это, заключается в том, что рамка указателя ffmpeg обеспечивает только одно. Ineed, чтобы этот указатель указывал на мои данные выходного кадра. И uotput frame представляет собой комбинацию данных Y, U и V. – Zax

+2

Ffmpeg никогда не просто «предоставляет» указатель. Вам нужно выделить структуру, содержащую одну. Какой указатель вы пытаетесь заполнить? AVPacket.data? Вам не хватает шага, и, не сказав точно, чего вы хотите достичь, на ваш вопрос ответить невозможно. – szatmary

+0

Спасибо за совет. Пожалуйста, проверьте мой отредактированный вопрос. – Zax

Смежные вопросы