Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Side by Side Diff: media/base/android/java/src/org/chromium/media/MediaCodecBridge.java

Issue 15822006: add error handling if MediaCodec fails to decode data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: don't report error on format change Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | media/base/android/media_codec_bridge.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.media; 5 package org.chromium.media;
6 6
7 import android.media.AudioFormat; 7 import android.media.AudioFormat;
8 import android.media.AudioManager; 8 import android.media.AudioManager;
9 import android.media.AudioTrack; 9 import android.media.AudioTrack;
10 import android.media.MediaCodec; 10 import android.media.MediaCodec;
11 import android.media.MediaCrypto; 11 import android.media.MediaCrypto;
12 import android.media.MediaFormat; 12 import android.media.MediaFormat;
13 import android.view.Surface; 13 import android.view.Surface;
14 import android.util.Log; 14 import android.util.Log;
15 15
16 import java.nio.ByteBuffer; 16 import java.nio.ByteBuffer;
17 17
18 import org.chromium.base.CalledByNative; 18 import org.chromium.base.CalledByNative;
19 import org.chromium.base.JNINamespace; 19 import org.chromium.base.JNINamespace;
20 20
21 /** 21 /**
22 * A wrapper of the MediaCodec class to facilitate exception capturing and 22 * A wrapper of the MediaCodec class to facilitate exception capturing and
23 * audio rendering. 23 * audio rendering.
24 */ 24 */
25 @JNINamespace("media") 25 @JNINamespace("media")
26 class MediaCodecBridge { 26 class MediaCodecBridge {
27 27
28 private static final String TAG = "MediaCodecBridge"; 28 private static final String TAG = "MediaCodecBridge";
29 29
30 // Error code for MediaCodecBridge. Keep this value in sync with
31 // INFO_MEDIA_CODEC_ERROR in media_codec_bridge.h.
32 private static final int MEDIA_CODEC_ERROR = -1000;
33
30 private ByteBuffer[] mInputBuffers; 34 private ByteBuffer[] mInputBuffers;
31 private ByteBuffer[] mOutputBuffers; 35 private ByteBuffer[] mOutputBuffers;
32 36
33 private MediaCodec mMediaCodec; 37 private MediaCodec mMediaCodec;
34 38
35 private AudioTrack mAudioTrack; 39 private AudioTrack mAudioTrack;
36 40
37 private static class DequeueOutputResult { 41 private static class DequeueOutputResult {
38 private final int mIndex; 42 private final int mIndex;
39 private final int mFlags; 43 private final int mFlags;
40 private final int mOffset; 44 private final int mOffset;
41 private final long mPresentationTimeMicroseconds; 45 private final long mPresentationTimeMicroseconds;
42 private final int mNumBytes; 46 private final int mNumBytes;
43 47
44 private DequeueOutputResult( 48 private DequeueOutputResult(int index, int flags, int offset,
45 int index, int flags, int offset, long presentationTimeMicroseconds, int numBytes) { 49 long presentationTimeMicroseconds, int numBytes) {
46 mIndex = index; 50 mIndex = index;
47 mFlags = flags; 51 mFlags = flags;
48 mOffset = offset; 52 mOffset = offset;
49 mPresentationTimeMicroseconds = presentationTimeMicroseconds; 53 mPresentationTimeMicroseconds = presentationTimeMicroseconds;
50 mNumBytes = numBytes; 54 mNumBytes = numBytes;
51 } 55 }
52 56
53 @CalledByNative("DequeueOutputResult") 57 @CalledByNative("DequeueOutputResult")
54 private int index() { return mIndex; } 58 private int index() { return mIndex; }
55 59
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 } 146 }
143 147
144 @CalledByNative 148 @CalledByNative
145 private void getOutputBuffers() { 149 private void getOutputBuffers() {
146 mOutputBuffers = mMediaCodec.getOutputBuffers(); 150 mOutputBuffers = mMediaCodec.getOutputBuffers();
147 } 151 }
148 152
149 @CalledByNative 153 @CalledByNative
150 private DequeueOutputResult dequeueOutputBuffer(long timeoutUs) { 154 private DequeueOutputResult dequeueOutputBuffer(long timeoutUs) {
151 MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); 155 MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
152 int index = mMediaCodec.dequeueOutputBuffer(info, timeoutUs); 156 int index = MEDIA_CODEC_ERROR;
157 try {
158 index = mMediaCodec.dequeueOutputBuffer(info, timeoutUs);
159 } catch(IllegalStateException e) {
160 Log.e(TAG, "Cannot dequeue output buffer " + e.toString());
161 }
153 return new DequeueOutputResult( 162 return new DequeueOutputResult(
154 index, info.flags, info.offset, info.presentationTimeUs, info.si ze); 163 index, info.flags, info.offset, info.presentationTimeUs, info.si ze);
155 } 164 }
156 165
157 @CalledByNative 166 @CalledByNative
158 private void configureVideo(MediaFormat format, Surface surface, MediaCrypto crypto, 167 private void configureVideo(MediaFormat format, Surface surface, MediaCrypto crypto,
159 int flags) { 168 int flags) {
160 mMediaCodec.configure(format, surface, crypto, flags); 169 mMediaCodec.configure(format, surface, crypto, flags);
161 } 170 }
162 171
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 mAudioTrack.play(); 215 mAudioTrack.play();
207 } 216 }
208 int size = mAudioTrack.write(buf, 0, buf.length); 217 int size = mAudioTrack.write(buf, 0, buf.length);
209 if (buf.length != size) { 218 if (buf.length != size) {
210 Log.i(TAG, "Failed to send all data to audio output, expected si ze: " + 219 Log.i(TAG, "Failed to send all data to audio output, expected si ze: " +
211 buf.length + ", actual size: " + size); 220 buf.length + ", actual size: " + size);
212 } 221 }
213 } 222 }
214 } 223 }
215 } 224 }
OLDNEW
« no previous file with comments | « no previous file | media/base/android/media_codec_bridge.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698