2016-11-03 51 views
0

내 질문에는 두 가지 측면이 있습니다. libav, ffmpeg, 3.1을 사용하고 있습니다.av_frame_get_buffer 후 정리


첫째, 당신은 어떻게 적절하게 그 버퍼 av_frame_get_buffer 할당 된 프레임을 처리합니까? 예컨대 :

AVFrame *frame = av_frame_alloc(); 
frame->width = ...; 
frame->height = ...; 
frame->format = ...; 
av_frame_get_buffer(frame, ...); 

어떤 버퍼가 av_frame_free(frame)에 대한 호출을 넘어, 수동으로 해제해야합니까?documentation은 특별한 것은 언급하지 않지만 내 경험상 ffmpeg 문서는 종종 중요한 세부 사항을 생략하거나 명백한 장소에서 멀리 떨어진 곳에 숨 깁니다. 나는 av_frame_freeav_frame_unref에 대한 코드를 살펴 보았지만 꽤 많은 부분이 나뉘어져 있었고 모든 것이 덮여 있는지를 판단 할 수 없었다.


둘째, av_frame_free 요구 사항을 넘어 경우 뭔가가 수행되어야하고 어떤 캐치 - 모든 당신의 데이터가 할당 된 방법를 모르는 경우 프레임을 청소하는 방법은? 예를 들어, someBuffer 가정 이미 적절한 크기로 할당 :

AVFrame *frame2 = av_frame_alloc(); 
frame2->width = ...; 
frame2->height = ...; 
frame2->format = ...; 
av_image_fill_arrays(frame2->data, frame2->linesize, someBuffer, 
        frame2->format, frame2->width, frame2->height, 1); 

동일한 코드를 사용하여 위의 예에서 모두 frameframe2을 확보 할 수있는 방법이 있나요? 즉, frame이고 데이터는 해제해야하고 frame2은 해제해야하지만 libav가 할당하지 않았으므로 someBuffer이 아니라 해제해야합니다.

답변

1

첫 번째 질문에 답하려면 - 펑키하지 않는 한 버퍼를 비우는 데 특별한 조치를 취하지 않아도됩니다. 이미지 데이터는 참조 카운터를 포함하는 AVBuffer에 의해 소유됩니다. 의 형태로 해당 AVBuffer에 대한 일부 참조가 있습니다. 관련 API를 사용하여 AVBufferRef 인스턴스를 처리 할 수 ​​있습니다 (설명은 libavutil/buffer.h 참조). AVFrame은 가리키는 데이터에 대한 참조를 보유 할 수 있으며 일반적으로 API가이를 처리하므로 사용자는이를 터치 할 필요가 없습니다. av_frame_get_buffer을 사용하여 프레임에 새 버퍼를 할당 할 수 있습니다. av_frame_unref 또는 av_frame_free을 사용하여 프레임을 "정리"하거나 정리하고 해제합니다 (다른 AVFrame 또는 인코더에서 사용하기 때문에 이미지 데이터를 비울 수 없음). 대부분의 다른 프레임 관련 API의 대부분은 버퍼를 인식합니다. 참조 카운팅을 우회 할 수 있으므로 AVBufferRef 포인터를 직접 복사하지 마십시오. av_buffer_ref을 대신 사용하십시오.

두 번째 질문에 대답하려면 av_frame_free 정확히 그 할 것입니다. 이 AVFrame에 첨부 된 다음 해제되어 AVFrame이됩니다. 버퍼에 의해 참조되지 않은 것은 건드리지 않습니다.