목차
1.Project Description
2.분석 환경 구축
3.FFmpeg 실행상태
4.ffserver의 개략적인 동작구조
5.HTTPState 상태도
6.Data Structure
7.feed1.ffm File Structure
8.ffmpeg 전체 동작구조 및 Summary
2.분석 환경 구축
3.FFmpeg 실행상태
4.ffserver의 개략적인 동작구조
5.HTTPState 상태도
6.Data Structure
7.feed1.ffm File Structure
8.ffmpeg 전체 동작구조 및 Summary
본문내용
nt로 받는데, 이 configuration file에서 원하는 서비스를 지정할수 있다. 예를들면 video codec의 종류라든가, frame rate등.
다음 그림은 별도의 Client가 ffserver가 제공하는 web page에 접속한 경우이다. 이경우는 ffserver가 mjpg와 asf 두가지 형태의 streamming service를 하고있는 상태이다. 링크를 click 하게되면, streaming service를 받을 수 있다.
4. ffserver의 동작 구조
ffserver는 config file에서 정의된 정보에 대한 stream을 만들게 된다. config file은 ffserver를 실행 시킬때, argument로 지정하는 파일이다. ffserver는 ffserver.conf 파일에서 정보를 얻어서 first feed와 first stream에 저장한다. ffserver는 poll이라는 함수를 이용해서 계속해서 port를 감시하게 되는데, 새로운 connection이 request 되면, connection을 생성하고, 그 연결 상태를 HTTPSTATE_WAIT_REQUEST로 이동 하게 된다. 이 연결 상태는 Linked List로 구현 되어 있다.
ffserver에 있는 http_server 함수가 무한루프를 돌면서 각각의 연결에 대해서 처리하지만, 실질적으로 처리하는 함수는 handle_http 함수이다.
HTTPSTATE_WAIT_REQUEST에서 요청을 받아들인 경우, 그 요청에 대한 분석은 http_parse_request에서 하게된다. 요청하는 정보가 ffserver에 존재할경우, 새로운 stream을 생성하여 그 stream의 buffer에 요청에 대응하는 request를 하게된다.
그러면 HTTPSTATE_SEND_HEADER에서 그 buffer에 든 정보를 보내게 된다. 실질적인 data의 전송은 http_send_data()가 하게되는데, buffer에 데이터가 충분한지 살피는 과정을 거치게된다. 이때 보통 frame 단위로
packet이 전송되게 되는데, asf format 같은 경우는 3,200 KByte 씩 전송되게된다.
5. HTTPState 상태도
HTTPState의 상태도이다.
함수의 흐름도이다.
6. Data Structure
AVFormatContext
format I/O context
Input, Output의 에 관련된 모든일을 관리하는 구조체
AVInputFormat
입력되는 정보를 decode 할 함수들을 등록
AVOutputFormat
출력 파일을 작성하는 함수들을 등록
AVInputStream
Input stream 관련 정보들(frame_number, decodeing_needed, )
AVStream
Stream 관련 정보들(time_length, r+frame_rate, id, index, )등록
ACOdecContext
RTp 관련 함수들과 Encoding 관련 정보들(codec_id, pict_type, bit_rate, frame_rate, ) 이 등록됨
AVCodec
Codec 관련 함수들이 등록됨
ffserver 는 HTTPContext 라는 자료구조가 가장 대표적인 자료구조이다. ffserver에서 사용되는 거의 모든 자료구조는 HTTPContxt 라는 자료구조에서 기반한다.
HTTPContext
HTTPState
HTTP상태를 저장
AVFormatContext
input file format 이 등록되는 구조체
FFStream
ffserver.conf에서 요청한 각각의 stream 의 description 이 등록되는 구조체
DataRateData
timeout을 측정하는 구조체
sockaddr_in socket에 관련된 구조체
pollfd polling에 관련된 구조체
이외에 RTSP state 에 관련된 구조체, RTP state에 관련된 구조체등이 존재
7. feed1.ffm file structure
ffserver와 ffmpeg 가 data를 주고 받을 때 사용하는 file 이 feed1.ffm 이다. 기본 packet size 는 4KByte 이다.
다음 그림은 feed1.ffm의 구조이다.
Common part
-4 : FFM1
-4 : packet size
-8 : current write position
-4 : 지원하는 stream number
-4 : 모든 stream 의 bit rate 합
Generic info part
-4 : codec id
-1 : codec type
-4 : codec bit rate
-4 : codec flags
Specific info part
-video case
-4 : frame rate * 1000 / frame rate base
-2 : width
-2 : height
-2 : gop size
-1 : qmin
-1 : qmx
-1 : max qdiff
-2 : qcompress * 10000
-2 : qblur * 10000
-4 : bit rate tolerance
-audio case
-4 : sample rate
-2 : channels
-2 : frame size
FFM PACKET HEADER
-2 : packet ID (0x666d)
-2 : fill size // (4KB packet중 dummy data size)
-8 : pts
-2 : frame offset (4KB frame 내부에서 다음 encoding data가 존재하는 위치)
FRAME PACKET HEADER
-1 : stream index
-1 : FLAG_KEY_FRAME ( inter or intra)
-3 : size (실제 데이터 size)
-3 : duration
8. ffmpeg 전체 동작구조 및 Summary
ffmpeg 은 open source Multimedia Stream Server 이다. ffmpeg 과 ffserver 의 두개 파트로 나뉘어서 구동되는데, ffmpeg은 실제 동영상 압축에 관련된 일을 수행하고, ffserver는 압축된 동영상을 전송하는 streamming server로서의 일을 수행한다.
다음 그림은 별도의 Client가 ffserver가 제공하는 web page에 접속한 경우이다. 이경우는 ffserver가 mjpg와 asf 두가지 형태의 streamming service를 하고있는 상태이다. 링크를 click 하게되면, streaming service를 받을 수 있다.
4. ffserver의 동작 구조
ffserver는 config file에서 정의된 정보에 대한 stream을 만들게 된다. config file은 ffserver를 실행 시킬때, argument로 지정하는 파일이다. ffserver는 ffserver.conf 파일에서 정보를 얻어서 first feed와 first stream에 저장한다. ffserver는 poll이라는 함수를 이용해서 계속해서 port를 감시하게 되는데, 새로운 connection이 request 되면, connection을 생성하고, 그 연결 상태를 HTTPSTATE_WAIT_REQUEST로 이동 하게 된다. 이 연결 상태는 Linked List로 구현 되어 있다.
ffserver에 있는 http_server 함수가 무한루프를 돌면서 각각의 연결에 대해서 처리하지만, 실질적으로 처리하는 함수는 handle_http 함수이다.
HTTPSTATE_WAIT_REQUEST에서 요청을 받아들인 경우, 그 요청에 대한 분석은 http_parse_request에서 하게된다. 요청하는 정보가 ffserver에 존재할경우, 새로운 stream을 생성하여 그 stream의 buffer에 요청에 대응하는 request를 하게된다.
그러면 HTTPSTATE_SEND_HEADER에서 그 buffer에 든 정보를 보내게 된다. 실질적인 data의 전송은 http_send_data()가 하게되는데, buffer에 데이터가 충분한지 살피는 과정을 거치게된다. 이때 보통 frame 단위로
packet이 전송되게 되는데, asf format 같은 경우는 3,200 KByte 씩 전송되게된다.
5. HTTPState 상태도
HTTPState의 상태도이다.
함수의 흐름도이다.
6. Data Structure
AVFormatContext
format I/O context
Input, Output의 에 관련된 모든일을 관리하는 구조체
AVInputFormat
입력되는 정보를 decode 할 함수들을 등록
AVOutputFormat
출력 파일을 작성하는 함수들을 등록
AVInputStream
Input stream 관련 정보들(frame_number, decodeing_needed, )
AVStream
Stream 관련 정보들(time_length, r+frame_rate, id, index, )등록
ACOdecContext
RTp 관련 함수들과 Encoding 관련 정보들(codec_id, pict_type, bit_rate, frame_rate, ) 이 등록됨
AVCodec
Codec 관련 함수들이 등록됨
ffserver 는 HTTPContext 라는 자료구조가 가장 대표적인 자료구조이다. ffserver에서 사용되는 거의 모든 자료구조는 HTTPContxt 라는 자료구조에서 기반한다.
HTTPContext
HTTPState
HTTP상태를 저장
AVFormatContext
input file format 이 등록되는 구조체
FFStream
ffserver.conf에서 요청한 각각의 stream 의 description 이 등록되는 구조체
DataRateData
timeout을 측정하는 구조체
sockaddr_in socket에 관련된 구조체
pollfd polling에 관련된 구조체
이외에 RTSP state 에 관련된 구조체, RTP state에 관련된 구조체등이 존재
7. feed1.ffm file structure
ffserver와 ffmpeg 가 data를 주고 받을 때 사용하는 file 이 feed1.ffm 이다. 기본 packet size 는 4KByte 이다.
다음 그림은 feed1.ffm의 구조이다.
Common part
-4 : FFM1
-4 : packet size
-8 : current write position
-4 : 지원하는 stream number
-4 : 모든 stream 의 bit rate 합
Generic info part
-4 : codec id
-1 : codec type
-4 : codec bit rate
-4 : codec flags
Specific info part
-video case
-4 : frame rate * 1000 / frame rate base
-2 : width
-2 : height
-2 : gop size
-1 : qmin
-1 : qmx
-1 : max qdiff
-2 : qcompress * 10000
-2 : qblur * 10000
-4 : bit rate tolerance
-audio case
-4 : sample rate
-2 : channels
-2 : frame size
FFM PACKET HEADER
-2 : packet ID (0x666d)
-2 : fill size // (4KB packet중 dummy data size)
-8 : pts
-2 : frame offset (4KB frame 내부에서 다음 encoding data가 존재하는 위치)
FRAME PACKET HEADER
-1 : stream index
-1 : FLAG_KEY_FRAME ( inter or intra)
-3 : size (실제 데이터 size)
-3 : duration
8. ffmpeg 전체 동작구조 및 Summary
ffmpeg 은 open source Multimedia Stream Server 이다. ffmpeg 과 ffserver 의 두개 파트로 나뉘어서 구동되는데, ffmpeg은 실제 동영상 압축에 관련된 일을 수행하고, ffserver는 압축된 동영상을 전송하는 streamming server로서의 일을 수행한다.