Накопилась очередная порция информации по RockChip, которую стоило бы уже опубликовать, чтобы случайно не потерялась.
Цитата Сообщение от aluver Посмотреть сообщение
Значит ли это, что SPDIF рокчипа не может 44.100 аппаратно?
RockChip S/PDIF аппаратно поддерживает до 16bit/48000 kHz, и только напрямую при воспроизведении через ALSA. Делать замеры “на лету” помогает утилита для карт Creative.
Нажмите на изображение для увеличения
Название: 2015-12-28.png
Просмотров: 0
Размер:	15.9 Кб
ID:	921544

"Трассировка" сборки из RockChip 4.4.2 KK SDK привела к большой группе закрытых библиотек в SDK RockChip, являющихся еще одной прослойкой между frameworks/av/media/rkffplayer (системный аудиоплеер для RockChip Android) и подсисиемой ALSA.

Библиотеки, по сути, являются плагинами libvpu:

После прочтения съесть!

device/rockchip/common/vpu/lib$ ls -la
libapedec.so libhevcdec.so libjpeghwenc.so libomxvpu_enc.so librkboxffplayer.so librk_hevcdec.so librkswscale.so libstagefrighthw.so
libffmpeg.so libjesancache.so libOMX_Core.so librk_audio.so librk_demux.so libRkOMX_Resourcemanager.so librkwmapro.so
libffmpeg_vp9dec.so libjpeghwdec.so libomxvpu_dec.so libRKBluray.so librkffplayer.so librk_on2.so libstagefright_hdcp.so

, и обеспечивают аппаратное декодирование на уровне libstagefright https://source.android.com/devices/media/index.html

В качестве примера очередного “подарка” можно привести декларацию RK_AUDIO_DEC_LIB = "librk_audio.so" из

После прочтения съесть!


, которая затем инициализирует декодер из “черного ящика”:
Код:
sp<MediaSource> decoder = rkAudioDecoder(source, decoderType);
По отладочным сообщениям сборки, на этапе декодирования тестовой записи с частотой дискретизации 48kHz происходит ошибка, после которой исходным материал “прореживается” до 44100 неведомыми алгоритмами внутри одной из закрытых библиотек, хотя до этого момента FFplayer честно пытается воспроизвести аудиоматериал без изменений:

После прочтения съесть!

Код:
E/FFplayer(  135): setDataSource offset =0,length = 1949074
I/FFplayer(  135): setDataSource(url =file/fd::24,offset::0)
I/FFplayer(  135): setDataSource(fileurl =/mnt/internal_sd/Music/110408__sandyrb__tubular-009.wav)
E/FFplayer(  135): ffmpeg version 1-6
E/FFplayer(  135): av_probe_input_buffer:avio_read
I/FFplayer(  135): flv_probe get probe score: 0
E/FFplayer(  135): Hery, probe size = 0
E/FFplayer(  135): avformat_open_input:read_header
E/FFplayer(  135): avformat_open_input:read_header ok
E/FFplayer(  135): Hery, s->iformat->name = wav
E/FFplayer(  135): Hery, s->duration = -9223372036854775808.000000
D/FFplayer(  135): There is not appleHls need find video Info
E/FFplayer(  135): estimate_timings:0: start_time: -9223372036854.775 duration: 0.325,base_time.den=48000,base_time.num=1
E/FFplayer(  135): stream: start_time: -9223372036854.775 duration: 6.764 bitrate=2305 kb/s
E/FFplayer(  135): audio name = pcm_s24le
D/FFplayer(  135): AudioStartTime=0,VideoStartTime=-1,tmpTime=-1
D/FFplayer(  135): setDataSource:start_time set 0
E/FFplayer(  135): FILE = /mnt/internal_sd/Music/110408__sandyrb__tubular-009.wav
D/FFplayer(  135): prepareAsync:prepare
I/FFplayer(  135): prepare in
I/FFplayer(  135): prepareVideo
E/FFplayer(  135): mVideoStreamIndex is -1
I/FFplayer(  135): prepareAudio
E/FFplayer(  135): Hery, Audio stream->codec->codec_id = 65548
D/FFplayer(  135): open MediaDecoder.cfg failed,so can't config anything
D/FFplayer(  135): File not exists!
I/FFplayer(  135): prepareSubtitle
I/FFplayer(  135): prepare ok
...
D/FFplayer(  135): initAudioPlayer
I/FFplayer(  135): ******************************************
I/FFplayer(  135): 
I/RkAudioPlayer(  135): mAudioSink->open in mSampleRate = 48000 channels = 2
I/FFplayer(  135): starting main player thread:2014-1-21
I/RkAudioPlayer(  135): audio mode: 0
I/FFplayer(  135): 
I/FFplayer(  135): 
I/FFplayer(  135): ******************************************
I/FFplayer(  135): decodeMovie:mCurrentState = 8
I/AudioTrack(  135): set() streamType 3 frameCount 4458 flags 0000 channelMask 3 sampleRate 48000 format 1
D/FFplayer(  135): start ok
E/DecodeAudio(  135): mStream->codec->channels = 2  mStream->codec->sample_rate = 48000
I/FFplayer(  135): decodeMovie:BufferingPlayer 0x0
I/FFMpegThread(  135): starting thread
D/DecodeAudio(  135): prepare()
E/FFplayer(  135): Hery, FF_MediaPlayer::BufferingPlayer
D/FFplayer(  135): end of onBufferingThread
I/AudioHardwareALSA(  135): Audio exiting sandby will open audio device
E/DecodeAudio(  135): mConfig->nrChans = -1,mConfig->samplingRate = 0
E/AudioSink(  135): received unknown event type: 1 inside CallbackWrapper !
W/gralloc (  132):  Debugmem The fd=80, in vmalloc !!!! Ishwc=0
I/MediaFocusControl(  508):  AudioFocus  requestAudioFocus() from android.media.AudioManager@418ca3e0com.rockchip.mediacenter.plugins.musicplay.l@418b9ae0
I/ActivityManager(  508): Displayed com.rockchip.mediacenter/.plugins.musicplay.MusicPlayer: +279ms
D/mali_winsys( 2423): new_window_surface returns 0x3000
W/gralloc (  132):  Debugmem The fd=43, in vmalloc !!!! Ishwc=0
V/ALSAModule(  135): SAMPLERATE:44100
D/ALSAModule(  135): open called for devices 00000800 in mode 0...
D/ALSAModule(  135): DevName: AndroidPlayback_Spdif_normal
E/ALSAModule(  135): buffersize: 3072, periodsize:1024
V/ALSAModule(  135): Set PLAYBACK PCM format to S16_LE (Signed 16 bit Little Endian)
V/ALSAModule(  135): Using 2 channels for PLAYBACK.
V/ALSAModule(  135): Set PLAYBACK sample rate to 44100 HZ
E/ALSAModule(  135): audio type flag: 0
V/ALSAModule(  135): Buffer size: 3072(frames)  period Size: 1024(frames)  periods: 3 (buffersize=periodSize*periods)
V/ALSAModule(  135): Latency: 69659   periodTime: 23219
D/ALSAModule(  135): 
D/ALSAModule(  135): DumpHandleInfo:
D/ALSAModule(  135): devices: 0xbfff
D/ALSAModule(  135): format: 0x2
D/ALSAModule(  135): channels: 2
D/ALSAModule(  135): sampleRate: 44100
D/ALSAModule(  135): latency: 69659
D/ALSAModule(  135): periodSize:1024
D/ALSAModule(  135): bufferSize:3072


Отладочные сообщения в предыдущих сборках 4.2.2 JB для RK3066 и RK3188 менее информативны, но результат “работы” системных плееров идентичен:

После прочтения съесть!


Код:
E/MediaPlayerFactory(   96): MediaPlayerFactory::getDefaultPlayerType
I/MediaPlayerFactory(   96): getDefaultPlayerType in
D/MediaPlayerFactory(   96): createPlayer:playerType=7
I/MediaPlayerFactory(   96):  create FFPlayer
I/FFMpegMediaPlayer(   96): setDataSource(file/fd::16,offset::0)
E/FFMpegMediaPlayer(   96): ffmpeg version 2-19
E/FFMpegMediaPlayer(   96): avio_open2:open
E/FFMpegMediaPlayer(   96): avio_open2:open ok
E/FFMpegMediaPlayer(   96): av_probe_input_buffer:avio_read
I/FFMpegMediaPlayer(   96): flv_probe get probe score: 0
E/FFMpegMediaPlayer(   96): Hery, probe size = 0
E/FFMpegMediaPlayer(   96): avformat_open_input:read_header
E/FFMpegMediaPlayer(   96): avformat_open_input:read_header ok
E/FFMpegMediaPlayer(   96): Hery, s->iformat->name = wav
E/FFMpegMediaPlayer(   96): FILE = /mnt/sdcard/Music/110408__sandyrb__tubular-009.wav
I/FFMpegMediaPlayer(   96): prepareVideo
E/FFMpegMediaPlayer(   96): mVideoStreamIndex is -1
I/FFMpegMediaPlayer(   96): prepareAudio
E/FFMpegMediaPlayer(   96): Hery, Audio stream->codec->codec_id = 65548
I/FFMpegMediaPlayer(   96): prepareSubtitle
V/MusicFXControlPanelReceiver( 2140): onReceive
V/MusicFXControlPanelReceiver( 2140): Action: android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION
V/MusicFXControlPanelReceiver( 2140): Package name: com.android.music
V/MusicFXControlPanelReceiver( 2140): Audio session: 19
D/MediaPlaybackService( 2261): **********************Playing file:/mnt/sdcard/Music/110408__sandyrb__tubular-009.wav
I/AudioService(  355):  AudioFocus  requestAudioFocus() from android.media.AudioManager@414af290com.android.music.b@414ae320
I/AudioService(  355):   Remote Control   registerMediaButtonIntent() for PendingIntent{414c2720: PendingIntentRecord{413c9fd0 com.android.music broadcastIntent}}
E/FFMpegMediaPlayer(   96): start in mCurrentState in
E/FFMpegMediaPlayer(   96): start in mCurrentState = 8
I/RkAudioPlayer(   96): mAudioSink->open in mSampleRate = 48000 channels = 2
I/FFMpegMediaPlayer(   96): ******************************************
I/FFMpegMediaPlayer(   96): 
I/FFMpegMediaPlayer(   96): starting main player thread:2013-2-24 
I/FFMpegMediaPlayer(   96): 
I/FFMpegMediaPlayer(   96): 
I/FFMpegMediaPlayer(   96): ******************************************
I/FFMpegMediaPlayer(   96): mCurrentState = 8
E/FFMpegMediaPlayer(   96): Hery, FF_MediaPlayer::BufferingPlayer
D/FFMpegMediaPlayer(   96): end of onBufferingThread
I/        (   96): starting thread
D/AUDIO_DECOE(   96): prepare()
D/MediaPlaybackActivity( 2261): initListView
D/MediaPlaybackActivity( 2261): mAdapter null
D/MediaPlaybackActivity( 2261): getColumIndices
D/MediaPlaybackActivity( 2261): getTrackCursor
E/MediaPlayerFactory(   96): MediaPlayerFactory::getDefaultPlayerType
I/MediaPlayerFactory(   96): getDefaultPlayerType in
D/MetadataRetrieverClient(   96): start FFPLAYER
I/RKMetadataRetriever(   96): setDataSource(35, 0, 1949074)
D/RKMetadataRetriever(   96): setDataSource:filePath=/mnt/sdcard/Music/110408__sandyrb__tubular-009.wav
E/FFMpegMediaPlayer(   96): ffmpeg version 2-19
E/FFMpegMediaPlayer(   96): avio_open2:open
E/FFMpegMediaPlayer(   96): avio_open2:open ok
E/FFMpegMediaPlayer(   96): av_probe_input_buffer:avio_read
I/FFMpegMediaPlayer(   96): flv_probe get probe score: 0
E/FFMpegMediaPlayer(   96): Hery, probe size = 0
E/FFMpegMediaPlayer(   96): avformat_open_input:read_header
E/FFMpegMediaPlayer(   96): avformat_open_input:read_header ok
E/MediaPlayerFactory(   96): MediaPlayerFactory::getDefaultPlayerType
I/MediaPlayerFactory(   96): getDefaultPlayerType in

D/MetadataRetrieverClient(   96): start FFPLAYER
I/RKMetadataRetriever(   96): setDataSource(35, 0, 1949074)
D/RKMetadataRetriever(   96): setDataSource:filePath=/mnt/sdcard/Music/110408__sandyrb__tubular-009.wav
E/FFMpegMediaPlayer(   96): ffmpeg version 2-19
E/FFMpegMediaPlayer(   96): avio_open2:open
E/FFMpegMediaPlayer(   96): avio_open2:open ok
E/FFMpegMediaPlayer(   96): av_probe_input_buffer:avio_read
I/FFMpegMediaPlayer(   96): flv_probe get probe score: 0
E/FFMpegMediaPlayer(   96): Hery, probe size = 0
E/FFMpegMediaPlayer(   96): avformat_open_input:read_header
E/FFMpegMediaPlayer(   96): avformat_open_input:read_header ok


Чтобы не пытаться переписать libStageFright с обходчиком RK-декодера, можно поискать полный исходный код библиотек.
Структура WAVDecoder’а известна по заголовочному файлу:

После прочтения съесть!



Пути в полном SDK (который имеется у разработчиков), и некоторую информацию о расположении недостающих файлах с исходным кодом, можно почерпнуть из бинарного файла библиотеки:

После прочтения съесть!


frameworks/av/media/libstagefright/rkaudiodecoder/wavdec/WAVDecoder.cpp:106 CHECK(!mStarted) failed.
frameworks/av/media/libstagefright/rkaudiodecoder/wavdec/WAVDecoder.cpp:53 CHECK(srcFormat->findInt32(kKeyChannelCount, &mNumChannels)) failed.

frameworks/av/media/libstagefright/rkaudiodecoder/wmadec/WMADecoder.cpp
frameworks/av/media/libstagefright/rkaudiodecoder/wmapro/WMAPRODecoder.cpp


Некоторые куски дикого кода из этой же серии



, и, в частности, можно предположить заимствование частей кода из декодеров для других платформ (чтобы, по крайней мере, понять логику преобразований):

После прочтения съесть!




Пока без выводов, но довольно неожиданно, поскольку казалось что платформа уже была достаточно глубоко изучена в плане звуковоспроизведения под Андроид. Даже если на этом этапе есть неудобства или выявляются баги, то рано или поздно коды и этих библиотек будут доведены до ума, и аппаратные возможности обработки могут сыграть даже большую роль, чем развитие звуковых возможностей Linux/Android .