KonstaT, on 13 May 2012 - 05:11 PM, said:
Thank you, much appreciated.
It's interesting as every prop lib needed to get HW video decoding on the Blade is there, which is a userland QDSP5 driver to interface with libstagefrighthw . Just in ARMv7 :|.
There seem to be not that much differences between QDSP5 and QDSP5v2 as i thought (there are seperate drivers in kernel though). Just need some Qualcom engineer to compile vendor/qcom/proprietary/mm-video/qdsp5 in ARMv6.
To put an end to all the nonsense written over this HW video decoding, which reached a new low with that pathetic attempt this week.
Hardware video decoding is done by the SoC. There are various steps in handling this.
First there are the drivers in the kernel space, which does the memory allocation etcetera.
https://github.com/b.../mach-msm/qdsp5
Then in the userspace there are these proprietary libraries, which are a blackbox to me. But they talk to the kernel space via the various files (Unix talks to all devices via the fily system) in the QDSP5 API language. Then they function as the OpenMAX API for the Android OS and there is libstagefright (working of this OpenMAX api) which functions as the Android API for apps like Youtube. AFAIK in Gingerbread there is already this OpenMAX api, but in ICS NDK they opened it up for native apps to communicate directly to the OpenMAX API to avoid latency for apps.
So then you're probably wondering why is my badword YoutubeHQ not working then? Well they changed libstagefright, i guess they are using a newer OpenMAX API version.
This is what happens if you try HW video decoding on ICS.
Quote
E/OMXCodec( 115): Attempting to allocate OMX node 'OMX.qcom.video.decoder.avc'
E/OMXCodec( 115): Successfully allocated OMX node 'OMX.qcom.video.decoder.avc'
I/OMXCodec( 115): [OMX.qcom.video.decoder.avc] Non-Interlaced format detected
I/OMXCodec( 115): [OMX.qcom.video.decoder.avc] AVC profile = 66 (Baseline), level = 30
E/OMXCodec( 115): [OMX.qcom.video.decoder.avc] Video O/P format.eColorFormat 0x7fa30c00
I/OMXCodec( 115): [OMX.qcom.video.decoder.avc] Enable frame by frame mode
E/QCvdec ( 115): Setparameter: unknown param 2130706434
W/OMXCodec( 115): Failed to set frame packing format on component
E/QCvdec ( 115): Error: get_config Not Implemented
I/OMXCodec( 115): [OMX.qcom.video.decoder.avc] video dimensions are 640 x 360
E/QCvdec ( 115): get_extension_index: Error, Not implemented
E/OMXNodeInstance( 115): OMX_GetExtensionIndex failed
W/QCvdec ( 115): ======================================================================
W/QCvdec ( 115): Open Max Statistics
W/QCvdec ( 115): ======================================================================
W/QCvdec ( 115): empty this buffer rate = NaN
W/QCvdec ( 115): empty this buffer total time = 0
W/QCvdec ( 115): empty this buffer count = 0
W/QCvdec ( 115): ======================================================================
E/OMXCodec( 115): Attempting to allocate OMX node 'OMX.TI.Video.Decoder'
E/OMXCodec( 115): Attempting to allocate OMX node 'OMX.SEC.AVC.Decoder'
E/OMXCodec( 115): Attempting to allocate OMX node 'OMX.SEC.FP.AVC.Decoder'
E/OMXCodec( 115): Attempting to allocate OMX node 'OMX.google.h264.decoder'
E/OMXCodec( 115): Successfully allocated OMX node 'OMX.google.h264.decoder'
I/OMXCodec( 115): [OMX.google.h264.decoder] Non-Interlaced format detected
I/OMXCodec( 115): [OMX.google.h264.decoder] AVC profile = 66 (Baseline), level = 30
E/OMXCodec( 115): [OMX.google.h264.decoder] Video O/P format.eColorFormat 0x429e7c14
I/OMXCodec( 115): [OMX.google.h264.decoder] Enable frame by frame mode
W/OMXCodec( 115): Failed to set frame packing format on component
I/OMXCodec( 115): [OMX.google.h264.decoder] video dimensions are 320 x 240
I/OMXCodec( 115): [OMX.google.h264.decoder] Crop rect is 320 x 240 @ (0, 0)
E/OMXCodec( 115): Attempting to allocate OMX node 'OMX.TI.AAC.decode'
E/OMXCodec( 115): Attempting to allocate OMX node 'OMX.google.aac.decoder'
E/OMXCodec( 115): Successfully allocated OMX node 'OMX.google.aac.decoder'
As you can see it loads the qcom decoder but then the qcom decoder craps out because of two not implemented commands: get_config and get_extension_index. You can pinpoint these changed to this commit to the android base frameworks/libstagefright.
https://github.com/a...00279963965a677 and this commit
https://github.com/a...ea798762916ff5c
Basically that is why it broke down and this needs to be implemented in the libraries that interface QDSP5 to OpenMAX. This is easy if you have the code. The code is available for QDSP6 and other Qualcomm API's like this. But not for QDSP5 which most likely is cause there is code is legally not allowed to be licensed with a opensource license such as GPL. I don't hope the same problem with intellectual property doesn't exist for compiled libraries that would prohibit Qualcomm to publish compiled ARMv6 libraries as they did for the Adreno drivers.
The dev community obtained these libraries before by getting them from existing roms. This will NOT happen and i repeat there will not be any ICS update to ANY armv6 phone of Qualcomm. For example ZTE doesn't base their ROM's on AOSP, they use CodeAurora which releases a full package which is fully compatible with the SoC they buy including all drivers and kernel. This ZTE N880E rom is clearly based from a CAF version.
But there isn't an CodeAurora release for the MSM7x27 and the CAF ICS codebase is as incompatible with v6 as AOSP. In Gingerbread they made all kinds of commits to make Gingerbread compatible with v6, such as Webkit and V8. In ICS-CAF there hasn't been single one. Timezones are still f*cked, Webkit uses JavascriptCore which is a lousy and barely functional javascript engine (as compared to V8). And there isn't much incentive for Qualcomm/CodeAurora to want to support ARMv6 MSM7227, in fact it is the opposite. Last year they released a pin-compatible snapdragon which is put in the market as a cheap solution to extend the lifehood from platforms such as the Blade. This enables ZTE to just take the platform which is completely designed already and replace the MSM7227 by the MSM7227A without much changes to the kernel as GPIO pins are still the same.