[automerger skipped] Merge Android 12 QPR3 ab/8391262 am: 0ae5cb4f27 -s ours am: 3df7e06bbc -s ours am skip reason: Merged-In I25addbafda13cb0a568edae3397b4df8005f2523 with SHA-1 61d6302e66 is already in history Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/TV/+/17544598 Change-Id: Id622454b4cb453ad1b7f115fbbfc73dc52f654e0 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2cff92d..75e2c4d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml
@@ -42,6 +42,7 @@ <uses-permission android:name="com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS"/> <!-- Permissions/feature for USB tuner --> <uses-permission android:name="android.permission.DVB_DEVICE"/> + <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <uses-feature android:name="android.hardware.usb.host" android:required="false"/>
diff --git a/common/src/com/android/tv/common/CommonPreferences.java b/common/src/com/android/tv/common/CommonPreferences.java index 5a94eec..72acfd1 100644 --- a/common/src/com/android/tv/common/CommonPreferences.java +++ b/common/src/com/android/tv/common/CommonPreferences.java
@@ -164,7 +164,8 @@ } } - public static synchronized @TrickplaySetting int getTrickplaySetting(Context context) { + @TrickplaySetting + public static synchronized int getTrickplaySetting(Context context) { SoftPreconditions.checkState(sInitialized); if (useContentProvider(context)) { return sPreferenceValues.getInt(PREFS_KEY_TRICKPLAY_SETTING, TRICKPLAY_SETTING_NOT_SET);
diff --git a/tuner/sampletunertvinput/Android.bp b/tuner/sampletunertvinput/Android.bp index ba08611..4e5900b 100644 --- a/tuner/sampletunertvinput/Android.bp +++ b/tuner/sampletunertvinput/Android.bp
@@ -29,7 +29,6 @@ platform_apis: true, system_ext_specific: true, - privileged: true, certificate: "platform", // product_specific: true, @@ -63,5 +62,13 @@ "tv-auto-value", "tv-auto-factory", ], + required: ["com.android.tv.samples.sampletunertvinput.xml"], // min_sdk_version: "29", } + +prebuilt_etc { + name: "com.android.tv.samples.sampletunertvinput.xml", + sub_dir: "permissions", + src: "com.android.tv.samples.sampletunertvinput.xml", + system_ext_specific: true, +}
diff --git a/tuner/sampletunertvinput/com.android.tv.samples.sampletunertvinput.xml b/tuner/sampletunertvinput/com.android.tv.samples.sampletunertvinput.xml new file mode 100644 index 0000000..d98e36c --- /dev/null +++ b/tuner/sampletunertvinput/com.android.tv.samples.sampletunertvinput.xml
@@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<permissions> + <privapp-permissions package="com.android.tv.samples.sampletunertvinput"> + <permission name="android.permission.ACCESS_TV_DESCRAMBLER"/> + <permission name="android.permission.ACCESS_TV_TUNER"/> + <permission name="android.permission.TUNER_RESOURCE_ACCESS"/> + </privapp-permissions> +</permissions>
diff --git a/tuner/sampletunertvinput/src/com/android/tv/samples/sampletunertvinput/SampleTunerTvInputService.java b/tuner/sampletunertvinput/src/com/android/tv/samples/sampletunertvinput/SampleTunerTvInputService.java index e86ced1..03e7965 100644 --- a/tuner/sampletunertvinput/src/com/android/tv/samples/sampletunertvinput/SampleTunerTvInputService.java +++ b/tuner/sampletunertvinput/src/com/android/tv/samples/sampletunertvinput/SampleTunerTvInputService.java
@@ -5,6 +5,7 @@ import android.content.Context; import android.media.MediaCodec; import android.media.MediaCodec.BufferInfo; +import android.media.MediaCodec.LinearBlock; import android.media.MediaFormat; import android.media.tv.tuner.dvr.DvrPlayback; import android.media.tv.tuner.dvr.DvrSettings; @@ -53,13 +54,13 @@ private static final int PACKET_SIZE = 188; private static final int TIMEOUT_US = 100000; - private static final boolean SAVE_DATA = true; - private static final String ES_PATH = "/data/local/tmp/test.es"; + private static final boolean SAVE_DATA = false; + private static final String ES_FILE_NAME = "test.es"; private static final MediaFormat VIDEO_FORMAT; static { // format extracted for the specific input file - VIDEO_FORMAT = MediaFormat.createVideoFormat("video/avc", 320, 240); + VIDEO_FORMAT = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 320, 240); VIDEO_FORMAT.setInteger(MediaFormat.KEY_TRACK_ID, 1); VIDEO_FORMAT.setLong(MediaFormat.KEY_DURATION, 9933333); VIDEO_FORMAT.setInteger(MediaFormat.KEY_LEVEL, 32); @@ -134,9 +135,11 @@ } if (mDvr != null) { mDvr.close(); + mDvr = null; } if (mTuner != null) { mTuner.close(); + mTuner = null; } mDataQueue = null; mSavedData = null; @@ -243,9 +246,9 @@ public void onFilterStatusChanged(Filter filter, int status) { if (DEBUG) { Log.d(TAG, "onFilterEvent video, status=" + status); - if (status == Filter.STATUS_DATA_READY) { - mDataReady = true; - } + } + if (status == Filter.STATUS_DATA_READY) { + mDataReady = true; } } }); @@ -275,7 +278,8 @@ if (DEBUG) { Log.d(TAG, "config res=" + res); } - File file = new File(ES_PATH); + String testFile = mContext.getFilesDir().getAbsolutePath() + "/" + ES_FILE_NAME; + File file = new File(testFile); if (file.exists()) { try { dvr.setFileDescriptor( @@ -323,10 +327,10 @@ mMediaCodec = null; } try { - mMediaCodec = MediaCodec.createDecoderByType("video/avc"); + mMediaCodec = MediaCodec.createDecoderByType(MediaFormat.MIMETYPE_VIDEO_AVC); mMediaCodec.configure(VIDEO_FORMAT, mSurface, null, 0); } catch (IOException e) { - Log.e(TAG, "Error: " + e.getMessage()); + Log.e(TAG, "Error in initCodec: " + e.getMessage()); } if (mMediaCodec == null) { @@ -357,23 +361,41 @@ while (!Thread.interrupted()) { if (!mDataReady) { Thread.sleep(100); + continue; } if (!mDataQueue.isEmpty()) { - if (queueCodecInputBuffer(mDataQueue.getFirst())) { + if (handleDataBuffer(mDataQueue.getFirst())) { // data consumed, remove. mDataQueue.pollFirst(); } - } else if (SAVE_DATA) { + } + if (SAVE_DATA) { mDataQueue.addAll(mSavedData); } - releaseCodecOutputBuffer(); } } catch (Exception e) { - Log.e(TAG, "Error: " + e.getMessage()); + Log.e(TAG, "Error in decodeInternal: " + e.getMessage()); } } - private boolean queueCodecInputBuffer(MediaEvent mediaEvent) { + private boolean handleDataBuffer(MediaEvent mediaEvent) { + if (mediaEvent.getLinearBlock() == null) { + if (DEBUG) Log.d(TAG, "getLinearBlock() == null"); + return true; + } + boolean success = false; + LinearBlock block = mediaEvent.getLinearBlock(); + if (queueCodecInputBuffer(block, mediaEvent.getDataLength(), mediaEvent.getOffset(), + mediaEvent.getPts())) { + releaseCodecOutputBuffer(); + success = true; + } + mediaEvent.release(); + return success; + } + + private boolean queueCodecInputBuffer(LinearBlock block, long sampleSize, + long offset, long pts) { int res = mMediaCodec.dequeueInputBuffer(TIMEOUT_US); if (res >= 0) { ByteBuffer buffer = mMediaCodec.getInputBuffer(res); @@ -381,13 +403,9 @@ throw new RuntimeException("Null decoder input buffer"); } - ByteBuffer data = mediaEvent.getLinearBlock().map(); - int sampleSize = (int) mediaEvent.getDataLength(); - int offset = (int) mediaEvent.getOffset(); - long pts = mediaEvent.getPts(); - + ByteBuffer data = block.map(); if (offset > 0 && offset < data.limit()) { - data.position(offset); + data.position((int) offset); } else { data.position(0); } @@ -407,14 +425,21 @@ + " size=" + (data.limit() - data.position())); } - while (data.position() < data.limit()) { - // fill codec input buffer - buffer.put(data.get()); + // fill codec input buffer + int size = sampleSize > data.limit() ? data.limit() : (int) sampleSize; + if (DEBUG) Log.d(TAG, "limit " + data.limit() + " sampleSize " + sampleSize); + if (data.hasArray()) { + Log.d(TAG, "hasArray"); + buffer.put(data.array(), 0, size); + } else { + byte[] array = new byte[size]; + data.get(array, 0, size); + buffer.put(array, 0, size); } - mMediaCodec.queueInputBuffer(res, 0, sampleSize, pts, 0); + mMediaCodec.queueInputBuffer(res, 0, (int) sampleSize, pts, 0); } else { - Log.d(TAG, "queueCodecInputBuffer res=" + res); + if (DEBUG) Log.d(TAG, "queueCodecInputBuffer res=" + res); return false; } return true; @@ -447,4 +472,4 @@ } } -} \ No newline at end of file +}