11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project
31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License.
61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at
71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software
111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and
141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License.
151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
17ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko#include "tunertvinput_jni.h"
181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#include <map>
191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#include "DvbManager.h"
21ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko#define LOG_TAG "tunertvinput_jni"
221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#include "logging.h"
231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko//-------------------------------------------------------------------------------
251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko// JNI native method implementation
261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko//-------------------------------------------------------------------------------
271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#define TS_PACKET_SIZE 188
291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#define TS_PAYLOAD_SIZE (TS_PACKET_SIZE * 7) // Fit Ethernet MTU (1500)
301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#define READ_TIMEOUT_MS 100
311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
321abddd9f6225298066094e20a6c29061b6af4590Nick Chalkostatic int sTotalBytesFetched = 0;
331abddd9f6225298066094e20a6c29061b6af4590Nick Chalkostatic std::map<jlong, DvbManager *> sDvbManagers;
341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class:     com_android_usbtuner_TunerHal
371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method:    nativeFinalize
38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Signature: (J)V
391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
401abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL
41ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeFinalize
421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *, jobject, jlong deviceId) {
431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId);
441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    if (it != sDvbManagers.end()) {
451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        delete it->second;
461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sDvbManagers.erase(it);
471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
51ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class:     com_android_usbtuner_TunerHal
52ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Method:    nativeTune
531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (JILjava/lang/String;)Z
541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
551abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT jboolean JNICALL
56ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeTune
571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *env, jobject thiz, jlong deviceId, jint frequency, jstring modulation, jint timeout_ms) {
581abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId);
591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    DvbManager *dvbManager;
601abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    if (it == sDvbManagers.end()) {
611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        dvbManager = new DvbManager(env, thiz);
621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sDvbManagers.insert(std::pair<jlong, DvbManager *>(deviceId, dvbManager));
631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    } else {
641abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        dvbManager = it->second;
651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
66ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    int res = dvbManager->tune(env, thiz,
671abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            frequency, env->GetStringUTFChars(modulation, 0), timeout_ms);
681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    return (res == 0);
691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
72ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class:     com_android_usbtuner_TunerHal
731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method:    nativeCloseAllPidFilters
741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J)V
751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
76ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJNIEXPORT void JNICALL Java_com_android_usbtuner_TunerHal_nativeCloseAllPidFilters
771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko  (JNIEnv *, jobject, jlong deviceId) {
781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId);
791abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    if (it != sDvbManagers.end()) {
801abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        it->second->closeAllDvbPidFilter();
811abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
841abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
85ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class:     com_android_usbtuner_TunerHal
861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method:    nativeStopTune
871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J)V
881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
891abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL
90ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeStopTune
911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *, jobject, jlong deviceId) {
921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId);
931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    if (it != sDvbManagers.end()) {
941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        it->second->stopTune();
951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
99ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class:     com_android_usbtuner_TunerHal
1001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method:    nativeAddPidFilter
1011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (JII)V
1021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
1031abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL
104ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeAddPidFilter
1051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *env, jobject thiz, jlong deviceId, jint pid, jint filterType) {
1061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId);
1071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    if (it != sDvbManagers.end()) {
1081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        it->second->startTsPidFilter(env, thiz, pid, filterType);
1091abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
1111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
113ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Class:     com_android_usbtuner_TunerHal
1141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method:    nativeWriteInBuffer
1151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J[BI)I
1161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
1171abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT jint JNICALL
118ba5845f23b8fbc985890f892961abc8b39886611Nick ChalkoJava_com_android_usbtuner_TunerHal_nativeWriteInBuffer
1191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko(JNIEnv *env, jobject thiz, jlong deviceId, jbyteArray javaBuffer, jint javaBufferSize) {
1201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    uint8_t tsBuffer[TS_PAYLOAD_SIZE];
1211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId);
1221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    if (it == sDvbManagers.end()) {
1231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return -1;
1241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    DvbManager *dvbManager = it->second;
1261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    // Always read multiple of TS_PACKET_SIZE
1281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    javaBufferSize = (javaBufferSize / TS_PACKET_SIZE) * TS_PACKET_SIZE;
1291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    int readBufferSize = (javaBufferSize < TS_PAYLOAD_SIZE) ? javaBufferSize : TS_PAYLOAD_SIZE;
1301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    int dataSize = dvbManager->readTsStream(env, thiz, tsBuffer, readBufferSize, READ_TIMEOUT_MS);
1321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    if (dataSize == 0) {
1331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        ALOGD("No data to read DVR");
1341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return 0;
1351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    } else if (dataSize < 0) {
1361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return -1;
1371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    sTotalBytesFetched += dataSize;
1401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    env->SetByteArrayRegion(javaBuffer, 0, dataSize, (jbyte *) tsBuffer);
1421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    return dataSize;
1431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
144