2014-01-28 5 views
1

저는 avcodec이 AVFrame 데이터에 대해 정렬되지 않은 메모리를 사용하도록하는 옵션에 대해 높게 평가했습니다.avcodec에 정렬되지 않은 프레임 데이터 평면을 사용하게하는 방법은 무엇입니까?

픽셀 형식에 따라 AVFrame-> 데이터의 수평면에 성능을 위해 메모리에 정렬 할 추가 데이터가 채워질 수 있습니다.

예 : 픽셀 당 4 바이트의 1920 * 1080 비디오는 1920 * 4 = 7680 바이트 /면을 갖습니다.

avcodec을 사용하면이 비디오를 디코딩하면 비행기 당 7808 바이트가 생성됩니다.

이렇게하면 추가 패딩의 7808 - 7680 = 128 바이트가 추가됩니다.

제 목적을 위해 avcodec이 정렬되지 않은 데이터를 사용하도록하여 연속 된 청크에 한 번에 하나씩 더 작은 조각을 복사하고 서식을 지정하는 대신 프레임 데이터의 전체 연속 청크를 복사 할 수 있습니다. 헤더에있는

다음 플래그 :이 CODEC_FLAG_UNALIGNED 할 AVCodecContext.flags 설정

/* encoding support 
    These flags can be passed in AVCodecContext.flags before initialization. 
    Note: Not everything is supported yet. 
*/ 

/** 
* Allow decoders to produce frames with data planes that are not aligned 
* to CPU requirements (e.g. due to cropping). 
*/ 
#define CODEC_FLAG_UNALIGNED 0x0001 

는 가정은 그렇지 않은는 AVFrame-> 데이터가 이제 정렬되지 않은 것입니다.

올바른 장소를보고 있거나이 플래그를 올바르게 사용하고 있는지 잘 모르겠습니다.

감사

호기심 조지

+0

코덱이 더 폭보다 보폭을 선택할 수있는 많은 이유가, CPU 제한 –

+0

"참고 그것의 한 부분 인. " 플래그가 지원되는지 확실합니까? –

답변

0

ffmpeg의 중요한 점은 실제로 정의 된 옵션을 실제로 확인하는 것입니다. 코덱의 많은처럼 보이지 않는 사실이 플래그를 사용하지 모든 것을 아직 지원됩니다

~/sources/ffmpeg-2.1.1> find libavcodec/ -name \*.c | xargs grep CODEC_FLAG_UNALIGNED 
libavcodec/hevc_ps.c:  !(s->avctx->flags & CODEC_FLAG_UNALIGNED)) { 
libavcodec/h264_ps.c:    !(h->avctx->flags & CODEC_FLAG_UNALIGNED)) { 
~/sources/ffmpeg-2.1.1> 
+0

당신이 맞습니다,이 플래그는 매우 드물게 사용되는데, 제 목적을 위해 플래그를 잘못 사용하고 있다는 질문에 대한 답변입니다. 유일한 질문은 이제 FLAG/Option/Setting이 무엇입니까? – user3244284

+0

ffmpeg 메일 링리스트에서 질문 할 수는 있지만 내 추측에는 그러한 플래그가 없습니다. 원래의 기술조차도 허용하지만 디코더가 정렬되지 않은 프레임을 생성 할 것을 요구하지는 않습니다. –

1

디코딩 후에는 공급 메모리 버퍼에 pixeles swrescale 포맷을 사용할 수있다. 입력 및 출력 해상도를 동일하게 설정하고 메모리 덩어리를 할당하고 라인 폭을 프레임 폭과 동일하게 설정하십시오.

+0

실제로이 문제를 해결할 수있는 방법 중 하나입니다. 불행히도 풀 HD 비디오를 사용하는 경우 불행히도이 swsrescale은 3-4 밀리 초의 오버 헤드를 추가합니다. 나는 건너 뜁니다. – user3244284

+1

디코더는 묻고있어. 아무것도 할 수없는 것을 얻을 수 없습니다. 정렬 된 메모리 액세스가 가장 빠르기 때문에 정렬 된 메모리에 씁니다. 그래서 디코더가 그것을하더라도, 그 3ms는 swscale 대신에 디코더에서 그냥 소비 될 것입니다. – szatmary