Skip to content

Commit

Permalink
[droidmedia] Query the list of supported color formats. JB#55092
Browse files Browse the repository at this point in the history
This commit adds droid_media_codec_get_supported_color_formats() which
is useful for implementing a video encoder: the color format of the input
video frame must be converted to match the capabilities of the codec.
  • Loading branch information
d-grigorev committed Aug 9, 2021
1 parent 29d5c8e commit a1beed1
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
25 changes: 25 additions & 0 deletions droidmediacodec.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/*
* Copyright (C) 2021 Open Mobile Platform LLC.
* Copyright (C) 2014-2015 Jolla Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -765,6 +766,30 @@ bool droid_media_codec_is_supported(DroidMediaCodecMetaData *meta, bool encoder)
return matchingCodecs.size() > 0;
}

unsigned int droid_media_codec_get_supported_color_formats(const char *mime, int encoder, uint32_t *formats, unsigned maxFormats)
{
android::sp<android::MediaCodecList::IMediaCodecList> list = android::MediaCodecList::getInstance();
int index = 0;
ssize_t matchIndex = list->findCodecByType(mime, encoder, index);

if (matchIndex >= 0) {
const android::sp<android::MediaCodecInfo> info = list->getCodecInfo(matchIndex);
if (info != nullptr) {
const android::sp<android::MediaCodecInfo::Capabilities> caps = info->getCapabilitiesFor(mime);
if (caps != nullptr) {
android::Vector<uint32_t> colorFormats;
caps->getSupportedColorFormats(&colorFormats);
maxFormats = std::min(maxFormats, colorFormats.size());
for (unsigned i = 0; i < maxFormats; i++) {
formats[i] = colorFormats.itemAt(i);
}
return maxFormats;
}
}
}
return 0;
}

bool droid_media_codec_start(DroidMediaCodec *codec)
{
#if ANDROID_MAJOR < 7
Expand Down
2 changes: 2 additions & 0 deletions droidmediacodec.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ DroidMediaBufferQueue *droid_media_codec_get_buffer_queue (DroidMediaCodec *code
DroidMediaCodec *droid_media_codec_create_decoder(DroidMediaCodecDecoderMetaData *meta);
DroidMediaCodec *droid_media_codec_create_encoder(DroidMediaCodecEncoderMetaData *meta);
bool droid_media_codec_is_supported(DroidMediaCodecMetaData *meta, bool encoder);
unsigned int droid_media_codec_get_supported_color_formats(const char *mime, int encoder,
uint32_t *formats, unsigned maxFormats);

void droid_media_codec_set_callbacks(DroidMediaCodec *codec, DroidMediaCodecCallbacks *cb, void *data);
void droid_media_codec_set_data_callbacks(DroidMediaCodec *codec,
Expand Down
1 change: 1 addition & 0 deletions hybris.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ HYBRIS_WRAPPER_1_0(int,droid_media_buffer_queue_length);
HYBRIS_WRAPPER_1_1(DroidMediaCodec*,DroidMediaCodecDecoderMetaData*,droid_media_codec_create_decoder);
HYBRIS_WRAPPER_1_1(DroidMediaCodec*,DroidMediaCodecEncoderMetaData*,droid_media_codec_create_encoder);
HYBRIS_WRAPPER_1_2(bool,DroidMediaCodecMetaData*,bool,droid_media_codec_is_supported);
HYBRIS_WRAPPER_1_4(unsigned,const char*,int,uint32_t*,unsigned,droid_media_codec_get_supported_color_formats);
HYBRIS_WRAPPER_1_1(bool,DroidMediaCodec*,droid_media_codec_start);
HYBRIS_WRAPPER_0_1(DroidMediaCodec*,droid_media_codec_stop);
HYBRIS_WRAPPER_0_1(DroidMediaCodec *,droid_media_codec_destroy);
Expand Down

0 comments on commit a1beed1

Please sign in to comment.