From 75bd4ebc1800e5960e8badfc0e7e18d1e97821a3 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 17 Feb 2020 11:22:38 +0000 Subject: [PATCH] Use &id_ as buffer_private_data for libgav1. This avoids the issue of whether it is defined behaviour to cast an arbitrary int (or even intptr_t) value to a void* pointer. This is the original approach used before commit 0915998add5918214fa0282a69b50a159168a6d5. PiperOrigin-RevId: 295552115 --- extensions/av1/src/main/jni/gav1_jni.cc | 34 ++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/extensions/av1/src/main/jni/gav1_jni.cc b/extensions/av1/src/main/jni/gav1_jni.cc index 4ce614a3d9..5be4f5b923 100644 --- a/extensions/av1/src/main/jni/gav1_jni.cc +++ b/extensions/av1/src/main/jni/gav1_jni.cc @@ -27,8 +27,6 @@ #endif // CPU_FEATURES_COMPILED_ANY_ARM_NEON #include -#include -#include #include #include #include // NOLINT @@ -134,6 +132,12 @@ class JniFrameBuffer { } } + // Not copyable or movable. + JniFrameBuffer(const JniFrameBuffer&) = delete; + JniFrameBuffer(JniFrameBuffer&&) = delete; + JniFrameBuffer& operator=(const JniFrameBuffer&) = delete; + JniFrameBuffer& operator=(JniFrameBuffer&&) = delete; + void SetFrameData(const libgav1::DecoderBuffer& decoder_buffer) { for (int plane_index = kPlaneY; plane_index < decoder_buffer.NumPlanes(); plane_index++) { @@ -162,7 +166,7 @@ class JniFrameBuffer { bool InUse() const { return reference_count_ != 0; } uint8_t* RawBuffer(int plane_index) const { return raw_buffer_[plane_index]; } - int Id() const { return id_; } + void* BufferPrivateData() const { return const_cast(&id_); } // Attempts to reallocate data planes if the existing ones don't have enough // capacity. Returns true if the allocation was successful or wasn't needed, @@ -359,19 +363,17 @@ int Libgav1GetFrameBuffer(void* callback_private_data, int bitdepth, uint8_t* const v_buffer = (info.uv_buffer_size != 0) ? jni_buffer->RawBuffer(2) : nullptr; - status = libgav1::SetFrameBuffer(&info, y_buffer, u_buffer, v_buffer, - reinterpret_cast(jni_buffer->Id()), - frame_buffer); + status = + libgav1::SetFrameBuffer(&info, y_buffer, u_buffer, v_buffer, + jni_buffer->BufferPrivateData(), frame_buffer); return (status == kLibgav1StatusOk) ? 0 : -1; } void Libgav1ReleaseFrameBuffer(void* callback_private_data, void* buffer_private_data) { JniContext* const context = static_cast(callback_private_data); - const intptr_t buffer_id = reinterpret_cast(buffer_private_data); - assert(buffer_id <= INT_MAX); - context->jni_status_code = - context->buffer_manager.ReleaseBuffer(static_cast(buffer_id)); + const int buffer_id = *static_cast(buffer_private_data); + context->jni_status_code = context->buffer_manager.ReleaseBuffer(buffer_id); if (context->jni_status_code != kJniStatusOk) { LOGE("%s", GetJniErrorMessage(context->jni_status_code)); } @@ -655,12 +657,11 @@ DECODER_FUNC(jint, gav1GetFrame, jlong jContext, jobject jOutputBuffer, return kStatusError; } - const intptr_t buffer_id = - reinterpret_cast(decoder_buffer->buffer_private_data); - assert(buffer_id <= INT_MAX); - context->buffer_manager.AddBufferReference(static_cast(buffer_id)); + const int buffer_id = + *static_cast(decoder_buffer->buffer_private_data); + context->buffer_manager.AddBufferReference(buffer_id); JniFrameBuffer* const jni_buffer = - context->buffer_manager.GetBuffer(static_cast(buffer_id)); + context->buffer_manager.GetBuffer(buffer_id); jni_buffer->SetFrameData(*decoder_buffer); env->CallVoidMethod(jOutputBuffer, context->init_for_private_frame_method, decoder_buffer->displayed_width[kPlaneY], @@ -669,8 +670,7 @@ DECODER_FUNC(jint, gav1GetFrame, jlong jContext, jobject jOutputBuffer, // Exception is thrown in Java when returning from the native call. return kStatusError; } - env->SetIntField(jOutputBuffer, context->decoder_private_field, - static_cast(buffer_id)); + env->SetIntField(jOutputBuffer, context->decoder_private_field, buffer_id); } return kStatusOk;