• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.camera.captureintent.resource;
18 
19 import com.android.camera.async.RefCountBase;
20 import com.android.camera.captureintent.PreviewTransformCalculator;
21 import com.android.camera.util.AspectRatio;
22 import com.android.camera.util.Size;
23 
24 import android.graphics.SurfaceTexture;
25 
26 import javax.annotation.ParametersAreNonnullByDefault;
27 
28 /**
29  * Workaround for TextureView/HAL issues in API1 / API2 Legacy Mode
30  * (b/19271661) for 16:9 preview streams on Nexus 4.
31  *
32  * This workaround for 16:9 consists of:
33  * 1) For any 16x9 resolution, the largest 4:3 preview size will be chosen for
34  *    SurfaceTexture default buffer. Noted that though the surface is 4:3, the
35  *    surface content (the preview) provided by HAL is 16:9.
36  * 2) Enable auto transform in TextureViewHelper rather than using
37  *    PreviewTransformCalculator. Since the preview content is still 16:9, we
38  *    still need to call {@link com.android.camera.TextureViewHelper#updateAspectRatio}
39  *    with 16:9 aspect ratio to get correct transform matrix.
40  */
41 @ParametersAreNonnullByDefault
42 public final class ResourceSurfaceTextureNexus4Impl extends ResourceSurfaceTextureImpl {
43     private static final Size LARGEST_4x3_PREVIEW_SIZE_NEXUS4 = new Size(1280, 960);
44 
45     /**
46      * Creates a reference counted {@link ResourceSurfaceTextureNexus4Impl}
47      * object.
48      */
create( RefCountBase<ResourceConstructed> resourceConstructed, SurfaceTexture surfaceTexture)49     public static RefCountBase<ResourceSurfaceTexture> create(
50             RefCountBase<ResourceConstructed> resourceConstructed,
51             SurfaceTexture surfaceTexture) {
52         ResourceSurfaceTexture resourceSurfaceTexture = new ResourceSurfaceTextureNexus4Impl(
53                 resourceConstructed,
54                 surfaceTexture,
55                 new PreviewTransformCalculator(resourceConstructed.get().getOrientationManager()));
56         return new RefCountBase<>(resourceSurfaceTexture);
57     }
58 
ResourceSurfaceTextureNexus4Impl( RefCountBase<ResourceConstructed> resourceConstructed, SurfaceTexture surfaceTexture, PreviewTransformCalculator previewTransformCalculator)59     private ResourceSurfaceTextureNexus4Impl(
60             RefCountBase<ResourceConstructed> resourceConstructed,
61             SurfaceTexture surfaceTexture,
62             PreviewTransformCalculator previewTransformCalculator) {
63         super(resourceConstructed, surfaceTexture, previewTransformCalculator);
64     }
65 
66     @Override
setPreviewSize(Size previewSize)67     public void setPreviewSize(Size previewSize) {
68         super.setPreviewSize(previewSize);
69 
70         final AspectRatio previewAspectRatio = AspectRatio.of(previewSize);
71         getResourceConstructed().get().getMainThread().execute(new Runnable() {
72             @Override
73             public void run() {
74                 getResourceConstructed().get().getModuleUI()
75                         .updatePreviewAspectRatio(previewAspectRatio.toFloat());
76             }
77         });
78 
79         // Override the preview selection logic to the largest N4 4:3
80         // preview size but pass in 16:9 aspect ratio in
81         // updatePreviewTransform() later.
82         if (previewAspectRatio.equals(AspectRatio.of16x9())) {
83             updateSurfaceTextureDefaultBufferSize(LARGEST_4x3_PREVIEW_SIZE_NEXUS4);
84         }
85     }
86 
87     @Override
updatePreviewTransform()88     public void updatePreviewTransform() {
89         // Override and let it be no-op since TextureViewHelper auto transform
90         // is enabled!
91     }
92 }
93