summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/tv/tuner/dvr/DvrSettings.java4
-rw-r--r--media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java2
-rw-r--r--media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java4
-rw-r--r--media/jni/android_media_tv_Tuner.cpp58
4 files changed, 45 insertions, 23 deletions
diff --git a/media/java/android/media/tv/tuner/dvr/DvrSettings.java b/media/java/android/media/tv/tuner/dvr/DvrSettings.java
index 3df721cdf18b..60f0d1686ea7 100644
--- a/media/java/android/media/tv/tuner/dvr/DvrSettings.java
+++ b/media/java/android/media/tv/tuner/dvr/DvrSettings.java
@@ -139,6 +139,10 @@ public class DvrSettings {
/**
* Sets status mask.
+ *
+ * <p>Use Filter.STATUS_ for {@link DvrRecorder} and DvrPlayback.STATUS_ for
+ * {@link DvrPlayback}.
+ * <p>If status mask is not set, no status is send to the listener.
*/
@NonNull
public Builder setStatusMask(@Filter.Status int statusMask) {
diff --git a/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java b/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java
index 561e4da59bf5..f54b686304c1 100644
--- a/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java
+++ b/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java
@@ -100,7 +100,7 @@ public final class IpFilterConfiguration extends FilterConfiguration {
*/
public static final class Builder {
private byte[] mSrcIpAddress = {0, 0, 0, 0};
- private byte[] mDstIpAddress = {0, 0, 0, 0};;
+ private byte[] mDstIpAddress = {0, 0, 0, 0};
private int mSrcPort = 0;
private int mDstPort = 0;
private boolean mPassthrough = false;
diff --git a/media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java b/media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java
index 3a45a18855a6..2aa40f9d45f7 100644
--- a/media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java
+++ b/media/java/android/media/tv/tuner/filter/MmtpFilterConfiguration.java
@@ -50,7 +50,7 @@ public final class MmtpFilterConfiguration extends FilterConfiguration {
}
/**
- * Creates a builder for {@link IpFilterConfiguration}.
+ * Creates a builder for {@link MmtpFilterConfiguration}.
*/
@NonNull
public static Builder builder() {
@@ -58,7 +58,7 @@ public final class MmtpFilterConfiguration extends FilterConfiguration {
}
/**
- * Builder for {@link IpFilterConfiguration}.
+ * Builder for {@link MmtpFilterConfiguration}.
*/
public static final class Builder {
private int mMmtpPid = Tuner.INVALID_TS_PID;
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 805831442756..fb8c276ecc8d 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -2362,28 +2362,25 @@ static sp<Filter> getFilter(JNIEnv *env, jobject filter) {
return (Filter *)env->GetLongField(filter, gFields.filterContext);
}
-static DvrSettings getDvrSettings(JNIEnv *env, jobject settings) {
+static DvrSettings getDvrSettings(JNIEnv *env, jobject settings, bool isRecorder) {
DvrSettings dvrSettings;
jclass clazz = env->FindClass("android/media/tv/tuner/dvr/DvrSettings");
uint32_t statusMask =
static_cast<uint32_t>(env->GetIntField(
settings, env->GetFieldID(clazz, "mStatusMask", "I")));
uint32_t lowThreshold =
- static_cast<uint32_t>(env->GetIntField(
- settings, env->GetFieldID(clazz, "mLowThreshold", "I")));
+ static_cast<uint32_t>(env->GetLongField(
+ settings, env->GetFieldID(clazz, "mLowThreshold", "J")));
uint32_t highThreshold =
- static_cast<uint32_t>(env->GetIntField(
- settings, env->GetFieldID(clazz, "mHighThreshold", "I")));
+ static_cast<uint32_t>(env->GetLongField(
+ settings, env->GetFieldID(clazz, "mHighThreshold", "J")));
uint8_t packetSize =
- static_cast<uint8_t>(env->GetIntField(
- settings, env->GetFieldID(clazz, "mPacketSize", "I")));
+ static_cast<uint8_t>(env->GetLongField(
+ settings, env->GetFieldID(clazz, "mPacketSize", "J")));
DataFormat dataFormat =
static_cast<DataFormat>(env->GetIntField(
settings, env->GetFieldID(clazz, "mDataFormat", "I")));
- DvrType type =
- static_cast<DvrType>(env->GetIntField(
- settings, env->GetFieldID(clazz, "mType", "I")));
- if (type == DvrType::RECORD) {
+ if (isRecorder) {
RecordSettings recordSettings {
.statusMask = static_cast<unsigned char>(statusMask),
.lowThreshold = lowThreshold,
@@ -2392,7 +2389,7 @@ static DvrSettings getDvrSettings(JNIEnv *env, jobject settings) {
.packetSize = packetSize,
};
dvrSettings.record(recordSettings);
- } else if (type == DvrType::PLAYBACK) {
+ } else {
PlaybackSettings PlaybackSettings {
.statusMask = statusMask,
.lowThreshold = lowThreshold,
@@ -3101,8 +3098,9 @@ static jint android_media_tv_Tuner_read_filter_fmq(
JNIEnv *env, jobject filter, jbyteArray buffer, jlong offset, jlong size) {
sp<Filter> filterSp = getFilter(env, filter);
if (filterSp == NULL) {
- ALOGD("Failed to read filter FMQ: filter not found");
- return (jint) Result::INVALID_STATE;
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Failed to read filter FMQ: filter not found");
+ return 0;
}
return copyData(env, filterSp->mFilterMQ, filterSp->mFilterMQEventFlag, buffer, offset, size);
}
@@ -3337,7 +3335,9 @@ static jint android_media_tv_Tuner_configure_dvr(JNIEnv *env, jobject dvr, jobje
return (int)Result::NOT_INITIALIZED;
}
sp<IDvr> iDvrSp = dvrSp->getIDvr();
- Result result = iDvrSp->configure(getDvrSettings(env, settings));
+ bool isRecorder =
+ env->IsInstanceOf(dvr, env->FindClass("android/media/tv/tuner/dvr/DvrRecorder"));
+ Result result = iDvrSp->configure(getDvrSettings(env, settings, isRecorder));
if (result != Result::SUCCESS) {
return (jint) result;
}
@@ -3440,19 +3440,21 @@ static int android_media_tv_Tuner_close_lnb(JNIEnv* env, jobject lnb) {
return (jint) r;
}
-static void android_media_tv_Tuner_dvr_set_fd(JNIEnv *env, jobject dvr, jobject jfd) {
+static void android_media_tv_Tuner_dvr_set_fd(JNIEnv *env, jobject dvr, jint fd) {
sp<Dvr> dvrSp = getDvr(env, dvr);
if (dvrSp == NULL) {
ALOGD("Failed to set FD for dvr: dvr not found");
}
- dvrSp->mFd = jniGetFDFromFileDescriptor(env, jfd);
+ dvrSp->mFd = (int) fd;
ALOGD("set fd = %d", dvrSp->mFd);
}
static jlong android_media_tv_Tuner_read_dvr(JNIEnv *env, jobject dvr, jlong size) {
sp<Dvr> dvrSp = getDvr(env, dvr);
if (dvrSp == NULL) {
- ALOGD("Failed to read dvr: dvr not found");
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Failed to read dvr: dvr not found");
+ return 0;
}
long available = dvrSp->mDvrMQ->availableToWrite();
@@ -3466,6 +3468,12 @@ static jlong android_media_tv_Tuner_read_dvr(JNIEnv *env, jobject dvr, jlong siz
long length = first.getLength();
long firstToWrite = std::min(length, write);
ret = read(dvrSp->mFd, data, firstToWrite);
+
+ if (ret < 0) {
+ ALOGE("[DVR] Failed to read from FD: %s", strerror(errno));
+ jniThrowRuntimeException(env, strerror(errno));
+ return 0;
+ }
if (ret < firstToWrite) {
ALOGW("[DVR] file to MQ, first region: %ld bytes to write, but %ld bytes written",
firstToWrite, ret);
@@ -3480,6 +3488,7 @@ static jlong android_media_tv_Tuner_read_dvr(JNIEnv *env, jobject dvr, jlong siz
ALOGD("[DVR] file to MQ: %ld bytes need to be written, %ld bytes written", write, ret);
if (!dvrSp->mDvrMQ->commitWrite(ret)) {
ALOGE("[DVR] Error: failed to commit write!");
+ return 0;
}
} else {
@@ -3524,12 +3533,14 @@ static jlong android_media_tv_Tuner_read_dvr_from_array(
static jlong android_media_tv_Tuner_write_dvr(JNIEnv *env, jobject dvr, jlong size) {
sp<Dvr> dvrSp = getDvr(env, dvr);
if (dvrSp == NULL) {
- ALOGW("Failed to write dvr: dvr not found");
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Failed to write dvr: dvr not found");
return 0;
}
if (dvrSp->mDvrMQ == NULL) {
- ALOGW("Failed to write dvr: dvr not configured");
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Failed to write dvr: dvr not configured");
return 0;
}
@@ -3546,6 +3557,12 @@ static jlong android_media_tv_Tuner_write_dvr(JNIEnv *env, jobject dvr, jlong si
long length = first.getLength();
long firstToRead = std::min(length, toRead);
ret = write(dvrSp->mFd, data, firstToRead);
+
+ if (ret < 0) {
+ ALOGE("[DVR] Failed to write to FD: %s", strerror(errno));
+ jniThrowRuntimeException(env, strerror(errno));
+ return 0;
+ }
if (ret < firstToRead) {
ALOGW("[DVR] MQ to file: %ld bytes read, but %ld bytes written", firstToRead, ret);
} else if (firstToRead < toRead) {
@@ -3559,6 +3576,7 @@ static jlong android_media_tv_Tuner_write_dvr(JNIEnv *env, jobject dvr, jlong si
ALOGD("[DVR] MQ to file: %ld bytes to be read, %ld bytes written", toRead, ret);
if (!dvrMq.commitRead(ret)) {
ALOGE("[DVR] Error: failed to commit read!");
+ return 0;
}
} else {