Получение PIX_FMT_YUYV422 из libswscale - PullRequest
1 голос
/ 22 сентября 2009

Я пытаюсь научиться использовать разные библиотеки ffmpeg с Какао и пытаюсь отобразить кадры с помощью Core Video. Кажется, я получил обратные вызовы CV для работы, и он получает кадры, которые я пытаюсь вставить в CVImageBufferRef, который я позже рисую с Core Image.

Проблема в том, что я пытаюсь заставить PIX_FMT_YUYV422 работать с libswscale, но как только я изменяю формат пикселя на любой другой, кроме PIX_FMT_YUV420P, происходит сбой с EXC_BAD_ACCESS.

Пока я использую YUV420P, программа работает, хотя она не отображается должным образом. Я подозревал, что формат пикселей не поддерживается, поэтому я хотел попробовать PIX_FMT_YUYV422.

Я уже работал и успешно записывал файлы PPM с PIX_FMT_RGB24. По какой-то причине это просто обрушилось на меня сейчас, и я не вижу, что может быть не так.

Я немного перегружен головой, но именно так я предпочитаю учиться. :)

Вот как я распределяю AVFrames:

inFrame = avcodec_alloc_frame();
outFrame = avcodec_alloc_frame();
int frameBytes = avpicture_get_size(PIX_FMT_YUYV422, cdcCtx->width, cdcCtx->height);


uint8_t *frameBuffer = malloc(frameBytes);
avpicture_fill((AVPicture *)outFrame, frameBuffer, PIX_FMT_YUYV422, cdcCtx->width, cdcCtx->height);

Затем я пытаюсь запустить его через swscale так:

static struct SwsContext *convertContext;


 if (convertContext == NULL) {
  int w = cdcCtx->width;
  int h = cdcCtx->height;
  convertContext = sws_getContext(w, h, cdcCtx->pix_fmt, outWidth, outHeight, PIX_FMT_YUYV422, SWS_BICUBIC, NULL, NULL, NULL);
  if (convertContext == NULL) {
   NSLog(@"Cannot initialize the conversion context!");
   return NO;
  }
 }

 sws_scale(convertContext, inFrame->data, inFrame->linesize, 0, outHeight, outFrame->data, outFrame->linesize);

И, наконец, я пытаюсь записать его в пиксельный буфер для использования с Core Image:

int ret = CVPixelBufferCreateWithBytes(0, outWidth, outHeight, kYUVSPixelFormat, outFrame->data[0], outFrame->linesize[0], 0, 0, 0, &currentFrame);

С 420P он работает, но не совпадает с форматом kYUVSPixel для пиксельного буфера, и, как я понимаю, он не принимает YUV420.

Я был бы очень признателен за любую помощь, независимо от того, насколько она мала, поскольку она могла бы помочь мне в борьбе. :)

Ответы [ 2 ]

1 голос
/ 04 ноября 2009

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

Вам также не нужно заполнять выходное изображение или даже выделять для него AVFrame.

0 голосов
/ 16 июня 2010

YUV420P - плоский формат. Следовательно, AVFrame.data[0] - это не вся история. Я вижу ошибку в

int ret = CVPixelBufferCreateWithBytes(0, outWidth, outHeight, kYUVSPixelFormat, outFrame->data[0], outFrame->linesize[0], 0, 0, 0, &currentFrame);

Для плоских форматов вам придется читать блоки данных от AVFrame.data[0] до AVFrame.data[3]

...