안드로이드 StageFrghit MPEG4 parctice ====== OMX_IL ====== 디코더 $ mkgrep "libOMX\..*\.[Dd]ecoder" ./device/ti/zoom2/zoom2.mk:96: libOMX.TI.Video.Decoder \ ./device/ti/zoom2/zoom2.mk:115: libOMX.TI.JPEG.decoder \ ./device/ti/zoom2/zoom2.mk:118: libOMX.TI.Video.Decoder \ ./hardware/ti/omx/image/src/openmax_il/jpeg_dec/Android.mk:20:LOCAL_MODULE:= libOMX.TI.JPEG.decoder ./hardware/ti/omx/image/src/openmax_il/jpeg_dec/Android.mk:35:LOCAL_SHARED_LIBRARIES := libOMX.TI.JPEG.decoder \ ./hardware/ti/omx/video/src/openmax_il/video_decode/Android.mk:34:LOCAL_MODULE:= libOMX.TI.Video.Decoder ./hardware/ti/omx/video/src/openmax_il/video_decode_ittiam/src/Android.mk:83:LOCAL_MODULE:= libOMX.TI.720P.Decoder 인코더 $ mkgrep "libOMX\..*\.[Ee]ncoder" ./device/ti/zoom2/zoom2.mk:97: libOMX.TI.Video.encoder \ ./device/ti/zoom2/zoom2.mk:103: libOMX.TI.Video.encoder \ ./device/ti/zoom2/zoom2.mk:109: libOMX.TI.JPEG.encoder \ ./hardware/ti/omx/image/src/openmax_il/jpeg_enc/Android.mk:19:LOCAL_MODULE:= libOMX.TI.JPEG.encoder ./hardware/ti/omx/image/src/openmax_il/jpeg_enc/Android.mk:33:LOCAL_SHARED_LIBRARIES := libOMX.TI.JPEG.encoder \ ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/test/Android.mk:16: libOMX.TI.mp4.splt.Encoder \ ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/test/Android.mk:17: libOMX.TI.h264.splt.Encoder \ ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/bin/Android.mk:7:LOCAL_MODULE := libOMX.TI.h264.splt.Encoder ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/bin/Android.mk:19:LOCAL_MODULE := libOMX.TI.mp4.splt.Encoder ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/bin/test_temp.mk:7:LOCAL_MODULE := libOMX.TI.mp4.splt.Encoder ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/bin/test_temp.mk:19:LOCAL_MODULE := libOMX.TI.h264.splt.Encoder ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/src/Android.mk:24: libOMX.TI.mp4.splt.Encoder \ ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/src/Android.mk:25: libOMX.TI.h264.splt.Encoder ./hardware/ti/omx/video/src/openmax_il/video_encode_ittiam/src/Android.mk:35:LOCAL_MODULE:= libOMX.TI.720P.Encoder ./hardware/ti/omx/video/src/openmax_il/video_encode/Android.mk:21:LOCAL_MODULE:= libOMX.TI.Video.encoder ====== 인코딩시 화면 튀는 문제 ====== 비디오 레코딩 사용 소스 cmds/stagefright를 사용하면 더미를 씀으로 테스트 할 수 있다. *./frameworks/base/cmds/stagefright/record.cpp *./frameworks/base/cmds/stagefright/stagefright.cpp *./frameworks/base/media/libmediaplayerservice/StagefrightRecorder.cpp 넥서스원 동영상 ========================================================================== Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264) ========================================================================== ========================================================================== Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding) FAAD: compressed input bitrate missing, assuming 128kbit/s! AUDIO: 32000 Hz, 2 ch, s16le, 128.0 kbit/12.50% (ratio: 16000->128000) Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio)) ========================================================================== zoom3 동영상 ========================================================================== Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family Selected video codec: [ffodivx] vfm: ffmpeg (FFmpeg MPEG-4) ========================================================================== ========================================================================== Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding) FAAD: compressed input bitrate missing, assuming 128kbit/s! AUDIO: 16000 Hz, 2 ch, s16le, 128.0 kbit/25.00% (ratio: 16000->64000) Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio)) ========================================================================== ====== 비디오 rotation 정보 ====== * liboverlay rotation 부분에 똥싸놨음. -_-; 프로요와 비교해 똥싼 부분 찾아보자. * [[http://gitorious.org/blazetablet/hardware-ti-omap3/trees/froyo/liboverlay]] ===== encode ====== frameworks/base/media/libstagefright/MPEG4Writer.cpp: writeCompositionMatrix()에서 받은 각도에 따른 composition matrix를 track header에 붙임. * FYI. mplayer, vlc에서 재생 해 보면, 각도가 적용되지 않고 센서 입력 해상도 대로 재생되드라. 파일을 까 봤을때 두번째 tkhd(비디오) + 40 offset 부터 9*4 바이트가 composition matrix 임. ===== decode ===== [~/workspace/cyanogenmod/frameworks/base/media/libstagefright] suapapa $ git grep kKeyRotation AwesomePlayer.cpp: kKeyRotation, &rotationDegrees)) { AwesomePlayer.cpp: kKeyRotation, &rotationDegrees)) { MPEG4Extractor.cpp: mLastTrack->meta->setInt32(kKeyRotation, rotationDegrees); MPEG4Writer.cpp: if (!mIsAudio && params && params->findInt32(kKeyRotationDegree, &rotationDegrees)) { StagefrightMetadataRetriever.cpp: if (!trackMeta->findInt32(kKeyRotation, &rotationAngle)) { AwesomePlayer 에서 frameworks/base/media/libstagefright/AwesomePlayer.cpp if (!strncmp("OMX.", component, 4)) { // Our OMX codecs allocate buffers on the media_server side // therefore they require a remote IOMXRenderer that knows how // to display them. mVideoRenderer = new AwesomeRemoteRenderer( mClient.interface()->createRenderer( mISurface, component, (OMX_COLOR_FORMATTYPE)format, decodedWidth, decodedHeight, mVideoWidth, mVideoHeight, rotationDegrees)); }