Well, it turns out I believe there's invalid code in the external camera
provider HAL, which happens to work only on 32 bits. More specifically,
this snippet:
https://cs.android.com/android/platform/superproject/+/master:hardware/interfaces/camera/provider/2.4/default/ExternalCameraProviderImpl_2_4.cpp;l=44-47

const char* kDevicePath = "/dev/";
constexpr char kPrefix[] = "video";
constexpr int kPrefixLen = sizeof(kPrefix) - 1;
constexpr int kDevicePrefixLen = sizeof(kDevicePath) + kPrefixLen + 1;

The above constants are used in the code to locate the numerical value in
the video device name, e.g. "2" in "/dev/video2". The constant kPrefixLen
is computed from constant char array kPrefix, minus one, as the array will
have the terminating null byte (which doesn't count when computing the
digit offset), that is 5. But then, kDevicePrefixLen does not make sense:
- first it uses "sizeof(kDevicePath)", which is the size of a pointer; that
is 4 on 32 bits, 8 on 64 bits
- second it adds one to the invalidly computed length of "/dev/video" (I'm
assuming that was the intent of the author)
Assuming the author thought "sizeof(kDevicePath)" would yield the length of
the constant string "/dev/" (I think that a reasonable assumption), then
incrementing by one "sizeof(kDevicePath) + kPrefixLen" does not make sense,
as the non-incremented value is what you're after. But on 32 bits,
something funny happens: the length of "/dev/" is 5, and
sizeof(kDevicePath) is 4. Maybe the author noticed that kDevicePrefixLen
didn't have the expected value, then noticed the previous line where
kPrefixLen is decremented by one, thought kPrefixLen should then be
re-incremented, and Bob's your uncle. Works fine on 32 bits, falls flat on
64 bits.

Not sure if anybody at Google is reading this, but you might wanna have a
look at that more closely.

Michael.




On Thu, Sep 29, 2022 at 3:09 PM Michael Goffioul <[email protected]>
wrote:

> Is there a particular reason to keep the external camera service a 32-bit
> only component [1]? From what I can see, the cameraserver process has been
> made available for 64-bit build [2].
>
> Thanks,
> Michael.
>
> [1]
> https://cs.android.com/android/platform/superproject/+/master:hardware/interfaces/camera/provider/2.7/default/Android.bp;l=62
> [2]
> https://cs.android.com/android/_/android/platform/frameworks/av/+/642fc1d0ef969c29a8882895d992b008b3bb7dd1
>

-- 
-- 
You received this message because you are subscribed to the "Android Building" 
mailing list.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-building?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"Android Building" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/android-building/CAB-99Lt_g9A_vA0jrY4fb-ACJH-sWWQZJwEny_AmCSwPjtHmjQ%40mail.gmail.com.

Reply via email to