"write" methods for DVR recording
Test: make; Change-Id: I00827ba33477f78985de05fed6e771e500c68c29
This commit is contained in:
@@ -712,6 +712,8 @@ public final class Tuner implements AutoCloseable {
|
||||
private native void nativeSetFileDescriptor(FileDescriptor fd);
|
||||
private native int nativeRead(int size);
|
||||
private native int nativeRead(byte[] bytes, int offset, int size);
|
||||
private native int nativeWrite(int size);
|
||||
private native int nativeWrite(byte[] bytes, int offset, int size);
|
||||
|
||||
private Dvr() {}
|
||||
|
||||
@@ -809,6 +811,20 @@ public final class Tuner implements AutoCloseable {
|
||||
}
|
||||
return nativeRead(bytes, offset, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes recording data to file.
|
||||
*/
|
||||
public int write(int size) {
|
||||
return nativeWrite(size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes recording data to buffer.
|
||||
*/
|
||||
public int write(@NonNull byte[] bytes, int offset, int size) {
|
||||
return nativeWrite(bytes, offset, size);
|
||||
}
|
||||
}
|
||||
|
||||
private Dvr openDvr(int type, int bufferSize) {
|
||||
|
||||
@@ -118,6 +118,10 @@ sp<IDvr> Dvr::getIDvr() {
|
||||
return mDvrSp;
|
||||
}
|
||||
|
||||
DvrMQ& Dvr::getDvrMQ() {
|
||||
return *mDvrMQ;
|
||||
}
|
||||
|
||||
/////////////// FilterCallback ///////////////////////
|
||||
//TODO: implement filter callback
|
||||
Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& /*filterEvent*/) {
|
||||
@@ -1004,13 +1008,66 @@ static int android_media_tv_Tuner_read_dvr(JNIEnv *env, jobject dvr, jint size)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int android_media_tv_Tuner_read_dvr_to_array(
|
||||
static int android_media_tv_Tuner_read_dvr_from_array(
|
||||
JNIEnv /* *env */, jobject /* dvr */, jbyteArray /* bytes */, jint /* offset */,
|
||||
jint /* size */) {
|
||||
//TODO: impl
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int android_media_tv_Tuner_write_dvr(JNIEnv *env, jobject dvr, jint size) {
|
||||
sp<Dvr> dvrSp = getDvr(env, dvr);
|
||||
if (dvrSp == NULL) {
|
||||
ALOGW("Failed to write dvr: dvr not found");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (dvrSp->mDvrMQ == NULL) {
|
||||
ALOGW("Failed to write dvr: dvr not configured");
|
||||
return 0;
|
||||
}
|
||||
|
||||
DvrMQ& dvrMq = dvrSp->getDvrMQ();
|
||||
|
||||
int available = dvrMq.availableToRead();
|
||||
int toRead = std::min(size, available);
|
||||
|
||||
int ret = 0;
|
||||
DvrMQ::MemTransaction tx;
|
||||
if (dvrMq.beginRead(toRead, &tx)) {
|
||||
auto first = tx.getFirstRegion();
|
||||
auto data = first.getAddress();
|
||||
int length = first.getLength();
|
||||
int firstToRead = std::min(length, toRead);
|
||||
ret = write(dvrSp->mFd, data, firstToRead);
|
||||
if (ret < firstToRead) {
|
||||
ALOGW("[DVR] MQ to file: %d bytes read, but %d bytes written", firstToRead, ret);
|
||||
} else if (firstToRead < toRead) {
|
||||
ALOGD("[DVR] read second region: %d bytes read, %d bytes in total", ret, toRead);
|
||||
auto second = tx.getSecondRegion();
|
||||
data = second.getAddress();
|
||||
length = second.getLength();
|
||||
int secondToRead = toRead - firstToRead;
|
||||
ret += write(dvrSp->mFd, data, secondToRead);
|
||||
}
|
||||
ALOGD("[DVR] MQ to file: %d bytes to be read, %d bytes written", toRead, ret);
|
||||
if (!dvrMq.commitRead(ret)) {
|
||||
ALOGE("[DVR] Error: failed to commit read!");
|
||||
}
|
||||
|
||||
} else {
|
||||
ALOGE("dvrMq.beginRead failed");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int android_media_tv_Tuner_write_dvr_to_array(
|
||||
JNIEnv /* *env */, jobject /* dvr */, jbyteArray /* bytes */, jint /* offset */,
|
||||
jint /* size */) {
|
||||
//TODO: impl
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const JNINativeMethod gTunerMethods[] = {
|
||||
{ "nativeInit", "()V", (void *)android_media_tv_Tuner_native_init },
|
||||
@@ -1077,7 +1134,9 @@ static const JNINativeMethod gDvrMethods[] = {
|
||||
{ "nativeSetFileDescriptor", "(Ljava/io/FileDescriptor;)V",
|
||||
(void *)android_media_tv_Tuner_dvr_set_fd },
|
||||
{ "nativeRead", "(I)I", (void *)android_media_tv_Tuner_read_dvr },
|
||||
{ "nativeRead", "([BII)I", (void *)android_media_tv_Tuner_read_dvr_to_array },
|
||||
{ "nativeRead", "([BII)I", (void *)android_media_tv_Tuner_read_dvr_from_array },
|
||||
{ "nativeWrite", "(I)I", (void *)android_media_tv_Tuner_write_dvr },
|
||||
{ "nativeWrite", "([BII)I", (void *)android_media_tv_Tuner_write_dvr_to_array },
|
||||
};
|
||||
|
||||
static const JNINativeMethod gLnbMethods[] = {
|
||||
|
||||
@@ -85,6 +85,7 @@ struct Dvr : public RefBase {
|
||||
Dvr(sp<IDvr> sp, jweak obj);
|
||||
~Dvr();
|
||||
int close();
|
||||
DvrMQ& getDvrMQ();
|
||||
sp<IDvr> getIDvr();
|
||||
sp<IDvr> mDvrSp;
|
||||
jweak mDvrObj;
|
||||
|
||||
Reference in New Issue
Block a user