ffplay 소스 코드 분석 (A) : AVPacket 및 AVFrame 관계에 PacketQueue

ffplay 소스 주소 : http://ffmpeg.org/doxygen/trunk/ffplay_8c_source.html

이 큐는 PacketQueue하는 FrameQueue, 분석 및 설명은 AVPacket 및 AVFrame 큐에 대한하자의 관계가 ffplay 있습니다.

A, AVPacket AVFrame 구조와 의미

AVPacket

압축 된 데이터를 저장하는 압축 오디오 데이터는 압축 비디오 데이터 및 자막 데이터 압축을 포함한다. 이는 압축 된 데이터를 저장하는 다중화 동작 통상 다음 디코더 입력으로 전달. 또는 인코더의 출력 및 멀티플렉서에 전달. 비디오 데이터를 압축하는 AVPacket은 일반적으로 비디오 프레임을 포함한다. 압축 된 음성 데이터의 경우, 압축 된 오디오는 몇 프레임을 포함 할 수있다.

AVFrame

디코딩 된 오디오 또는 비디오 데이터를 저장한다. AVFrame은 av_frame_free를 통해 발표 av_frame_alloc에 ​​의해 할당해야합니다.

둘 사이의 관계

av_read_frame 얻어진 압축 데이터는 일반적으로 세 개의 압축 패킷 (비디오, 오디오 및 자막) AVPacket로 표시되어 있는데,이 패킷 AVPacket.

그런 다음 AVPacket에 전화 avcodec_send_packet 및 avcodec_receive_frame는 AVFrame를 디코딩.

참고 : 처음부터는 FFmpeg 3.x를이 avcodec_decode_video2은 avcodec_send_packet 및 avcodec_receive_frame로 대체, 포기되었다.

두, ffplay 큐 관계

세 ffplay의 PacketQueue이 있으며, 각각의 비디오 패킷의 큐는 패킷, 오디오 패킷 및 서브 타이틀 큐의 큐이다.

따라서, 세 가지 FrameQueue 비디오 프레임 큐, 오디오 및 자막 프레임 큐 프레임 큐가 존재한다.

초기화는 각각의 작업 큐 stream_open 기능을 수행하고, 초기화 동작에 packet_queue_init frame_queue_init에 의해 수행된다. 수동 초기화 PacketQueue AVPacket 할당 구조없이 것을 유의하지만, 바로 복호화 과정에 사용 AVPacket. FrameQueue에서 그것은 av_frame_alloc AVFrame 구조에 의해 수동으로 할당된다.

read_thread 함수에서 av_read_frame 기능을 통해 판독 된 데이터 패킷은 다음 AVPacket packet_queue_put 호는 PacketQueue에 첨가 하였다.

video_thread 함수, 데이터 get_video_frame 기능은 FrameQueue 첨가 후 통화 queue_picture AVFrame에 의해 리드 프레임이다.

그런 다음 두 개의 큐를 연결하는 방법은? 당신은 분석 read_thread 기능에 의해 알 수있다 :

첫째, 필요한 디 멀티플렉싱 및 디코딩 데이터 구조를 생성한다. 그리고, 세 개의 데이터를 각각 개방 stream_component_open 함수를 통해 스트리밍. 최종적으로, 데이터 패킷을 개별적으로 대응 av_read_frame PacketQueue 추가 다중화된다. stream_component_open 기능으로 작업을 디코딩 ffplay 구체적 큐 decoder_init 함수 PacketQueue을 지정 PacketQueue 입력을 언급하고, 디코더, 디코더 구조가 큐의 구성원을 갖는 데이터 구조를 설정하는 작업을 디코딩 주로 담당한다. 이 작품은 stream_component_open에서 수행된다. 지정한 후 PacketQueue 복호 함수 PacketQueue AVFrame 구조로부터 get_video_frame, 최종적 queue_picture FrameQueue의 기능에 의해 얻어진 디코딩 된 프레임에 추가.

추천

출처www.cnblogs.com/renhui/p/12217958.html