MediaObserver 인터페이스¶
재생과 녹화 컴포넌트는 MediaObserver에서 유도된 사용자 정의 Observer 객체를 통하여 이벤트 등을 처리합니다.
oasis::MediaObserver는 OasisMedia.h에 아래와 같이 정의되어 있습니다.
class MediaObserver : public std::enable_shared_from_this<MediaObserver>
{
public:
MediaObserver();
virtual ~MediaObserver();
//recording or playing started and stopped
virtual void onStarted(void *user_data, const char *file_path);
virtual void onStopped(void *user_data, media_report_reason_t reason, void *details);
//recording a new file
virtual void onFileChanged(void *user_data, const char *new_file_path);
virtual void onError(void *user_data, media_report_reason_t reason, void *details);
//periodic report every 1 second.
virtual void onInfo(void *user_data, MediaInfo *info);
virtual void onInfoEx(void *user_data, MediaInfoEx *info);
//player paused and resumed
virtual void onPaused(void *user_data, MediaInfo *info);
virtual void onResumed(void *user_data, MediaInfo *info);
//event recording started and completed(aborted)
virtual void onEventRecordingStarted(void *user_data, media_report_reason_t reason, const char *file_path);
virtual void onEventRecordingCompleted(void *user_data, media_report_reason_t reason, const char *file_path);
//motion recording started and completed(aborted)
virtual void onMotionRecordingStarted(void *user_data, media_report_reason_t reason, const char *file_path);
virtual void onMotionRecordingCompleted(void *user_data, media_report_reason_t reason, const char *file_path);
virtual void queryNewFilePath(void *user_data, recording_mode_t file_type, bool rear_camera_on, bool sound_on, std::string &file_path);
virtual void onSnapshotCompleted(void *user_data, uint32_t snapshot_id, int32_t camera_id, int error, const std::vector<char> &jpeg_image_data, const struct timeval ×tamp);
};
Note
MediaObserver::onPaused와 MediaObserver::onResumed는 녹화 파일 재생시에 호출됩니다.
헤더 파일¶
OasisMedia.h
인터페이스 함수¶
void
onStarted
(
void *
user_data
,
const char *
file_path
)
OasisMedia.h
녹화가 시작된 후 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
file_path
녹화 파일 경로입니다.
void
onStopped
(
void *
user_data
,
media_report_reason_t
reason
,
void *
details
)
OasisMedia.h
녹화가 중지된 후 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
reason
중지 이유를 나타내는 상수 값입니다.
details
중지 이유에 해당하는 상세 데이터입니다. 중지 이유 값에 따라 타입이 정의됩니다.
일반 media_report_reason_t 상수 값은 아래와 같습니다.
| Reason | 상수값 | 의미 | details |
|---|---|---|---|
| kMediaReportGenericError | -1 | 일반 오류입니다. | nullptr |
| kMediaReportNoError | 0 | 오류가 발생하지 않았습니다. | nullptr |
녹화 컴포넌트의 경우, media_report_reason_t 상수 값은 아래와 같습니다.
| Reason | 상수값 | 의미 | details |
|---|---|---|---|
| kRecordingAllFilesRecorded | 201 | 모든 녹화를 마쳤습니다. | nullptr |
| kRecordingErrorNotReady | 400 | 녹화 준비가 되지 않는 상태에서 녹화 시작을 요청하였습니다. | nullptr |
| kRecordingErrorAlreadyStarted | 401 | 녹화가 이미 시작되었습니다. | nullptr |
| kRecordingErrorWriterPreparationFailed | 402 | 녹화 파일 준비 실패했습니다. | nullptr |
| kRecordingErrorWriterStartFailed | 403 | 녹화 파일 쓰기 시작 실패했습니다. | nullptr |
| kRecordingErrorSourceStartFailed | 404 | 카메라 장치 시작 실패했습니다. | nullptr |
| kRecordingErrorNotPrepared | 405 | 준비되지 않은 상태입니다 (사용하지 않음). | nullptr |
| kRecordingErrorNotStarted | 406 | 시작되지 않은 상태입니다 (사용하지 않음). | nullptr |
| kRecordingErrorDiskAlmostFull | 407 | 디스크가 거의 꽉찬 상태입니다 (사용하지 않음). | nullptr |
| kRecordingErrorNoDiskMount | 408 | 마운팅되어 있지 않습니다 (사용하지 않음). | nullptr |
| kRecordingErrorFileIO | 409 | 파일 I/O 오류 입니다. | nullptr |
| kRecordingErrorResumeFailed | 410 | 녹화 재시작에 실패했습니다. | nullptr |
| kRecordingErrorMediaDataTimeout | 411 | 영상 데이터가 일정 시간 동안 발생하지 않았습니다. | int32_t camera_id |
| kRecordingErrorIndexTableOverflow | 412 | 파일의 index 테이블 용량 초과입니다. | nullptr |
| kRecordingErrorEventWriterPreparationFailed | 430 | 이벤트 녹화 파일 준비 실패했습니다. | nullptr |
| kRecordingErrorEventWriterStartFailed | 431 | 이벤트 녹화 파일 시작 실패했습니다. | nullptr |
| kRecordingErrorMotionWriterPreparationFailed | 450 | 모션 녹화 파일 준비 실패했습니다. | nullptr |
| kRecordingErrorMotionWriterStartFailed | 451 | 모션 녹화 파일 시작 실패했습니다. | nullptr |
| kRecordingErrorMediaCacheReadErrorBegin | 460 | 미디어 캐쉬 읽기에 실패가 처음으로 발생했습니다. | nullptr |
| kRecordingErrorMediaCacheReadErrorEnd | 461 | 미디어 캐쉬 읽기에 실패가 끝났습니다. | nullptr |
| kSnapshotErrorTimeout | 600 | 스냅샷 타임아웃이 발생하였습니다. | nullptr |
재생 컴포넌트의 경우, media_report_reason_t 상수 값은 아래와 같습니다.
| Reason | 상수값 | 의미 | details |
|---|---|---|---|
| kPlayingEndOfFileReached | 200 | 녹화 파일 재생이 끝났습니다. | nullptr |
| kPlayingErrorFileNotFound | 500 | 녹화 파일을 찾을 수 없습니다. | nullptr |
| kPlayingErrorFileExtNotSupported | 501 | 지원되지 않는 녹화 파일 확장자입니다. | nullptr |
| kPlayingErrorSourceNotReady | 502 | 녹화 파일이 준비되지 않았습니다. | nullptr |
| kPlayingErrorNoTracks | 503 | 재생할 트랙이 없습니다. | nullptr |
| kPlayingErrorSoundNotReady | 504 | 소리가 준비되지 않았습니다. | nullptr |
| kPlayingErrorSoundDecoderNotReady | 505 | 소리 디코더가 준비되지 않았습니다. | nullptr |
| kPlayingErrorVideoRendererNotReady | 506 | 비디오 렌더러가 준비되지 않았습니다. | nullptr |
| kPlayingErrorVideoDecoderNotReady | 507 | 비디오 디코더가 준비되지 않았습니다. | nullptr |
| kPlayingErrorVideoTrackNotReady | 508 | 영상 트랙이 준비되지 않았습니다. | nullptr |
| kPlayingErrorSubtitleSourceNotReady | 509 | 캡션 소스가 준비되지 않았습니다. | nullptr |
| kPlayingErrorTextTrackNotReady | 510 | 텍스트 트랙이 준비되지 않았습니다. | nullptr |
| kPlayingErrorTextDecoderNotReady | 511 | 텍스트 디코더가 준비되지 않았습니다. | nullptr |
| kPlayingErrorTextRendererNotReady | 512 | 텍스트 렌더러가 준비되지 않았습니다. | nullptr |
| kPlayingErrorVideoRendererStartFailed | 513 | 비디오 렌더러를 시작할 수 없습니다. | nullptr |
| kPlayingErrorAudioRendererStartFailed | 514 | 소리 렌더러를 시작할 수 없습니다. | nullptr |
| kPlayingErrorTextRendererStartFailed | 515 | 텍스트 렌더러를 시작할 수 없습니다. | nullptr |
| kPlayingErrorSoundDeviceBusy | 516 | 소리 장치가 사용 중입니다. | nullptr |
| kPlayingErrorDisplayLayerNotReady | 517 | 디스플레이 레이어가 준비되지 않았습니다. | nullptr |
| kPlayingErrorZeroDuration | 518 | 재생 시간이 0초입니다. | nullptr |
| kPlayingErrorVideoSetupException | 519 | 영상 초기화 오류입니다. | nullptr |
| kPlayingErrorAudioSetupException | 520 | 소리 초기화 오류입니다. | nullptr |
| kPlayingErrorAdasNotReady | 521 | ADAS가 준비되지 않았습니다. | nullptr |
| kPlayingErrorAdasStartFailed | 522 | ADAS 시작 오류입니다. | nullptr |
void
onFileChanged
(
void *
user_data
,
const char *
new_file_path
)
OasisMedia.h
새 파일로 녹화가 재시작될 때 호출됩니다. 녹화 중 file-duration-secs 만큼 경과하거나 할당된 파일 크기를 초과할 경우, 자동으로 새 파일로 녹화를 재시작합니다. 새 파일 경로는 MediaObserver::queryNewFilePath 호출 될 때 변경할 수 있습니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
new_file_path
새 녹화 파일 경로입니다.
void
onError
(
void *
user_data
,
media_report_reason_t
reason
,
void *
details
)
OasisMedia.h
녹화 도중 오류가 발생하였을 때 호출됩니다. 사용자는 별도 쓰레드에서 stopRecording을 호출하여 녹화를 중지하거나 오류 문제를 해결한 후 녹화를 재시작할 수 있습니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
reason
중지 이유를 나타내는 상수 값입니다.
details
중지 이유에 해당하는 상세 데이터입니다. 중지 이유 값에 따라 타입이 정의됩니다.
Note
kRecordingErrorMediaCacheReadErrorBegin ~ kRecordingErrorMediaCacheReadErrorEnd는 미디어 캐쉬에서 녹화에 필요한 데이터를 읽어 올 수 없는 경우 발생됩니다. 무시하고 녹화를 계속 진행할 경우, 발생 시간대 범위의 데이터는 모두 "0" 값으로 채워지게 됩니다. 영상의 경우는 재생시 녹색 화면이 보일 수 있으며, 음성의 경우는 묵음이 발생합니다.
void
onInfo
(
void *
user_data
,
MediaInfo *
info
)
OasisMedia.h
report-media-info-ex를 "0" 로 설정하고 createRecorder로 Recoder 객체를 생성할 경우, 녹화 시작 후 1초 단위로 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
info
상태 정보입니다.
void
onInfoEx
(
void *
user_data
,
MediaInfoEx *
info
)
OasisMedia.h
report-media-info-ex를 "1" 로 설정하고 createRecorder로 Recoder 객체를 생성할 경우, 녹화 시작 후 1초 단위로 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
info
상태 정보입니다.
void
onEventRecordingStarted
(
void *
user_data
,
media_report_reason_t
reason
,
const char *
file_path
)
OasisMedia.h
이벤트 녹화가 시작되었을 때 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
reason
녹화 시작시 발생한 이유를 나타내는 상수 값입니다.
file_path
이벤트 녹화 파일 절대 경로입니다.
void
onEventRecordingCompleted
(
void *
user_data
,
media_report_reason_t
reason
,
const char *
file_path
)
OasisMedia.h
이벤트 녹화가 끝났을 때 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
reason
녹화 완료시 발생한 이유를 나타내는 상수 값입니다.
file_path
이벤트 녹화 파일 절대 경로입니다.
void
onMotionRecordingStarted
(
void *
user_data
,
media_report_reason_t
reason
,
const char *
file_path
)
OasisMedia.h
모션 녹화가 시작되었을 때 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
reason
녹화 시작시 발생한 이유를 나타내는 상수 값입니다.
file_path
모션 녹화 파일 절대 경로입니다.
void
onMotionRecordingCompleted
(
void *
user_data
,
media_report_reason_t
reason
,
const char *
file_path
)
OasisMedia.h
모션 녹화가 끝났을 때 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
reason
녹화 완료시 발생한 이유를 나타내는 상수 값입니다.
file_path
모션 녹화 파일 절대 경로입니다.
void
queryNewFilePath
(
void *
user_data
,
recording_mode_t
file_type
,
bool
rear_camera_on
,
bool
sound_on
,
std::string &
file_path
)
OasisMedia.h
새 녹화를 시작하기전 새 녹화파일 경로 확인을 위해 호출됩니다. 사용자는 필요할 경우 새 녹화파일명이나 경로를 변경하여 리턴합니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
file_type
kRecordingModeNormal(0) 이나 kRecordingModeSniffing(1) 값 중 하나입니다.
rear_camera_on
후방 카메라도 녹화 중인 경우, true 입니다.
sound_on
소리도 녹화 중인 경우, true 입니다.
file_path
IN
OUT
새 녹화파일 절대 경로입니다. 변경된 절대경로를 리턴할 수 있습니다. 자동으로 생성된 절대 파일 경로로 폴더 위치는 녹화 객체 생성시나 패러미터 변경시 적용된 normal-folder-path 키 값입니다.
void
onSnapshotCompleted
(
void *
user_data
,
uint32_t
snapshot_id
,
int32_t
camera_id
,
int
error
,
const std::vector<char> &
file_path
,
const struct timeval &
timestamp
)
OasisMedia.h
녹화 컴포넌트의 takeRecordingShapshot 호출 후 스냅샷 생성이 종료되거나 오류가 발생할 경우, 호출됩니다.
매개변수
user_data
startRecording 호출 시 전달받은 user_data 매개변수 값입니다.
snapshot_id
takeRecordingShapshot 호출 시 전달받은 snapshot_id 값입니다.
camera_id
takeRecordingShapshot 호출 시 전달받은 스냅샷 대상 camera ID입니다.
error
오류 값입니다. 스냅샷이 성공한 경우, kMediaReportNoError(0) 값을 갖습니다.
file_path
스냅샷으로 생성된 JPEG 파일 데이터입니다. error가 0인 경우에만 유효합니다. 사용자는 별도 쓰레드에서 이 데이터를 파일에 저장할 수 있습니다.
timestamp
스냅샷 생성 시 timestamp 입니다.
구조체¶
struct
TimeShiftStat
OasisMedia.h
이벤트/모션 녹화 상태 정보입니다.
타입
이름
설명
bool
recording
이벤트/모션 녹화 중입니다.
int32_t
maxSamples
최대 샘플 개수입니다.
int32_t
curSamples
현재 샘플 개수입니다.
int32_t
curSize
현재 샘플 개수의 총 크기입니다.
uint32_t
video1Length
주 영상 데이터 길이입니다.
uint32_t
video2Length
그외 영상 데이터 길이입니다.
uint32_t
metaLength
메타 데이터 길이입니다.
uint32_t
audioLength
소리 데이터 길이입니다.
uint32_t
fileLength
현재 이벤트/모션 녹화 파일 크기입니다.
struct
RecordingStat
OasisMedia.h
일반 녹화 상태 정보입니다.
타입
이름
설명
int32_t
maxSamples
일반 녹화 최대 샘플 개수입니다.
int32_t
curSamples
일반 녹화 현재 샘플 개수입니다.
uint32_t
video1Length
주 영상 데이터 길이입니다.
uint32_t
video2Length
그외 영상 데이터 길이입니다.
uint32_t
metaLength
메타 데이터 길이입니다.
uint32_t
audioLength
소리 데이터 길이입니다.
uint32_t
fileLength
현재까지 저장된 녹화 파일 크기입니다.
TimeShiftStat
motionStat
모션 녹화 상태입니다.
struct
OffsStat
OasisMedia.h
Oasis 파일시스템 (OFFS) 상태 정보입니다.
타입
이름
설명
int32_t
qNormalCount
일반 녹화 큐 길이입니다. 녹화 객체가 일반 녹화 데이터를 OFFS에 쓰기 요청시 증가하며, OFFS가 쓰기를 마치면 감소합니다.
int32_t
qEventCount
이벤트 녹화 큐 길이입니다. 녹화 객체가 이벤트나 모션 녹화 데이터를 OFFS에 쓰기 요청시 증가하며, OFFS가 쓰기를 마치면 감소합니다.
ssize_t
qNormalSize
일반 녹화 큐에 쌓인 데이터의 총 길이입니다. 바이트 단위입니다.
ssize_t
qEventSize
이벤트 녹화 큐에 쌓인 데이터의 총 길이입니다. 바이트 단위입니다.
int32_t
cacheHits
읽기 캐쉬를 사용할 경우, 응용 프로그램에서 OFFS로 읽기 요청을 하였을 때, 이 캐쉬 엔트리가 사용될 경우, 히트 개수입니다. 히트 개수가 증가하면 그 만큼 캐쉬 사용에 효과가 있다는 의미입니다.
int32_t
checkDuration
체크 기간입니다. 보통 1초 간격으로 상태 정보에 대한 체크가 이루어집니다.
int32_t
inSize
체크 기간 동안 발생한 OFFS에 요청된 총 쓰기 요청 크기입니다.
int32_t
outSize
체크 기간 동안 OFFS가 디스크에 실제 쓴 크기입니다. inSize와 outSize를 비교하며, 데이터가 적체되고 있는지 확인할 수 있으며, 적체될 경우, SD 카드의 쓰기 성능 개선이 필요합니다.
int32_t
elapsedSum
OFFS가 쓰기 작업을 하는데 걸리는 시간의 총합으로 밀리초 단위입니다. 쓰기 성능을 체크하는데 참고할 수 있습니다. 예를들어, 1분 분량의 녹화 파일 저장시 총 쓰기에 걸리는 시간을 확인할 수 있습니다.
struct
MediaCacheStat
OasisMedia.h
미디어캐쉬 상태 정보입니다.
타입
이름
설명
uint32_t
hits_
미디어 캐쉬 히트 수입니다. 메모리에 임시 저장된 데이터가 실제로 존재할 경우, 히트 수가 증가합니다.
uint32_t
nohits_
미디어 캐쉬 히트하지 못한 수입니다. 메모리에 임시 저장된 데이터가 시간이 경과되어 다른 미디어 데이터로 덮어 써질 경우, 원하는 미디어 데이터를 얻지 못하여 발생한 경우에 노히트 수가 증가합니다. 미디어캐쉬 데이터 크기를 증가하거나 녹화시 발생한 데이터양에 영향을 주는 특성(프레임레이트, 해상도, 비트레이트, 인코딩 품질 등)을 조정할 필요가 있습니다.
uint32_t
total_buffer_count_
할당된 미디어 버퍼의 총 개수입니다. 미디어 데이터에 정보(크기나 위치나 종류 등)를 보관하는 용도로 각 컴포넌트에서 사용됩니다.
uint32_t
free_buffer_count_
사용가능한 미디어 버퍼 개수입니다.
uint32_t
get_buffer_count_
미디어 버퍼 획득 요청 횟수입니다. 컴포넌트가 미디어 버퍼를 사용하기 위해 요청하여, 성공적으로 미디어 버퍼를 획득한 경우, 이 값이 증가합니다.
uint32_t
put_buffer_count_
미디어 버퍼 반환 요청 횟수입니다. 컴포넌트가 미디어 버퍼를 반환할 경우, 이 값이 증가합니다.
int32_t
check_duration_
체크 기간입니다. 보통 1초 간격으로 상태 정보에 대한 체크가 이루어집니다.
int32_t
in_size_
미디어캐쉬 저장 총 데이터 크기입니다. 바이트 단위입니다. 하나의 녹화 파일을 저장하는 동안 꾸준히 증가합니다.
struct
MediaInfo
OasisMedia.h
MediaObserver::onInfo 이벤트 호출 콜백 함수에서 매개 변수로 전달됩니다.
타입
이름
설명
bool
sniffing
true 이면 Sniffing 모드입니다. false이면 일반 녹화 모드입니다.
int64_t
durationUs
현재까지 파일 녹화(재생) 시간입니다. 타임랩스 녹화인 경우, 실제 파일 총 재생 시간입니다.
int64_t
currentTimestampUs
durationUs 값과 동일합니다.
TimeShiftStat
timeshiftStat
이벤트/모션 녹화 상태 정보입니다.
struct
MediaInfoEx
OasisMedia.h
MediaObserver::onInfoEx 이벤트 호출 콜백 함수에서 매개 변수로 전달됩니다. 녹화 객체 생성시 report-media-info-ex를 "1"로 설정해야 됩니다.
타입
이름
설명
bool
sniffing
true 이면 Sniffing 모드입니다. false이면 일반 녹화 모드입니다.
int64_t
durationUs
현재까지 파일 녹화(재생) 시간입니다. 타임랩스 녹화인 경우, 실제 파일 총 재생 시간입니다.
int64_t
currentTimestampUs
durationUs 값과 동일합니다.
TimeShiftStat
timeshiftStat
이벤트/모션 녹화 상태 정보입니다.
RecordingStat
writerStat
녹화 쓰기 상태 정보입니다.
OffsStat
offsStat
파일시스템 상태 정보입니다.
MediaCacheStat
mediaCacheStat
미디어캐쉬 상태 정보입니다.
예제¶
녹화 컴포넌트의 사용자는 MediaObserver를 base class로 하여 클래스를 정의하고, oasis::startRecording 함수 호출 시 매개변수로 전달합니다. 아래는 MyRecordingObserver를 생성하고 oasis::startRecording에 전달하는 예입니다.
std::shared_ptr<MyRecordingObserver> recording_observer = std::make_shared<MyRecordingObserver>();
RecorderRef recorder = createRecorder(parameters);
startRecording(recorder, recording_observer, nullptr /*user_data*/);