In this demo you will find not gems, but mere rutabagas.
This repo currently contains only one demo, but I have more demos waiting to be pushed.
This buggy demo decodes a video file with the AMedia APIs; imports the AHardwareBuffer from the decoded video frame into Vulkan using VK_ANDROID_external_memory_android_hardware_buffer; creates a VkSamplerYcbcrConversion to convert the AHardwareBuffer's YCbCr colorspace into RGB; copies the AHardwareBuffer into the VkSurface with a small shader and the VkSamplerYcbcrConversion.
The Android NDK, of course.
glslc: CMake must be able to find the 'glslc' executable. The easiest way to satisfy CMake is to put 'glslc' in your shell's $PATH.
To build and install glslc:
> git clone -b known-good https://github.com/google/shaderc ~/shaderc
> cd ~/shaderc
> ./update_shaderc_sources.py
> cd src
> cmake -G Ninja
> ninja
> sudo ninja install
pkg='com.example.media_to_vk_ahb' ./gradlew buildDebug adb connect $REMOTE ./gradlew installDebug adb shell pm grant "$pkg" android.permission.READ_EXTERNAL_STORAGE
adb push /your/favorite/video.ext /sdcard/Download/ adb logcat -c adb shell am start -n "$pkg/android.app.NativeActivity" \ -e mediaSrc /sdcard/Download/video.ext adb logcat -v color
If the activity dies early with a log message like
"Vulkan does not have device extension VK_EXT_queue_family_foreign"
then edit the #ifdef found by git grep 'WORKAROUND: VK_EXT_queue_family_foreign'
.
The activity accepts the following optional key/value pairs:
-e useVkExternalFormat (auto|never|always) # default=auto
Control if the AHardwareBuffer is imported with
VkExternalFormatANDROID. If useVkExternalFormat=never but the
AHardwareBuffer requires an external format, then the activity will
abort with a diagnostic log message.
-e useVkValidation (true|false) # default=true
Enable the Vulkan validation layers.