ffmpeg MPEG TS read함수 분석
*av_find_stream_info함수에서 오디오 비디오 데이터 읽는 과정에서 호출되는 함수 ( ffplay.c)
[c]
decode_thread(void *arg)
av_open_input_file(...);
av_read_frame_internal(ic, &pkt1);
av_read_packet(s, &cur_pkt);
s->iformat->read_packet(s, pkt); (mpegts_read_packet)
ts->pkt = pkt;
handle_packets(ts, 0);
read_packet(s, packet, ts->raw_packet_size);
handle_packet(ts,packet);
[/c]
* av_open_input_file(...);
- av_probe_input_format 함수 사용하여 입력 스트림 포맵(AVInputFormat fmt)를 알아낸다.
- av_open_input_stream 함수 호출하여 해당 포맵의 헤더를 읽는다.(ic->iformat->read_header())
* av_read_frame_internal(ic, &pkt1);
- av_read_packet함수 호출하여 cur_pkt에 ES packet 데이터(PES 데이터)를 가져온다.
- parser없는 경우 바로 pkt1에 바로 올려 준다.
- parser 가 있는 경우 parser 함수로 parsing하여 pkt1에 올려 준다.
- parser를 거친 데이터는 parser를 거치지 않은 데이터 보다 pkt1에 늦게 올라 올 수 있다. 하지만 pkt1 구조체에 타임 스탬프 정보 pts, dts가 있기 때문에 디코더에 넣어 줄 때 시간에 맞게 넣어 주면 된다.
* av_read_packet(s, &cur_pkt);
- s->iformat->read_packet (mpegts_read_packet)함수 호출하여 ES packet 데이터를 읽어 온다.
* mpegts_read_packet(s, pkt);
- handle_packets함수 호출 한다.
* handle_packets(ts, 0);
- read_packet함수 사용하여 하나의 TS packet (188 바이트)를 읽어 handle_packet 함수에서 PES SL Header 분석 하여 ES packet를 만들어 ts->pkt에 넣어 준다.
- 오디오 데이터와 같이 PES 데이터가 하나의 TS 에 다 들어가는 경우 한번의 read_packet함수와 handle_packet함수 호출로 ES packet이 만들어 진다.
- 비디오 경우 하나의 ES packet 이 여러 TS packet으로 구성되어 handle_packets 여러번에 걸쳐 ES packet 데이터가 만들어 진다.
* read_packet(s, packet, ts->raw_packet_size);
- TS packet 하나를 읽는다.
* handle_packet(ts,packet);
- TS audio video PID 에 해당하는 packet 핸들러 함수를 호출 한다.
- MPEG TS의 경우 오디오/비디오 핸들러 함수는 mpegts_push_data 함수 이다.
* mpegts_push_data
- mpegts_push_data 함수는 TS packet의 헤더를 parsing하여 pes 데이터를 만들어 낸다.
- MPEGTS_PAYLOAD state에서 pes szie를 검사하여 일치하면 ts->stop_parse=1 로 하여 handle_packets함수 루프를 멈춘다.
'OldStory > WORKS' 카테고리의 다른 글
ffmpeg compile options (0) | 2011.11.16 |
---|---|
ARM SYMPOSIUM (0) | 2011.11.15 |
Stack overflow (0) | 2011.09.02 |
PYUV: Raw video sequence player (0) | 2011.06.28 |
T-DMB Video 표준 H.264/AVC (0) | 2011.06.09 |