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/* 3665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Class: com_android_tv_tuner_TunerHal 371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeFinalize 38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Signature: (J)V 391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 401abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL 4165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick ChalkoJava_com_android_tv_tuner_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/* 5165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Class: com_android_tv_tuner_TunerHal 52ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Method: nativeTune 531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (JILjava/lang/String;)Z 541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 551abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT jboolean JNICALL 5665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick ChalkoJava_com_android_tv_tuner_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/* 7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Class: com_android_tv_tuner_TunerHal 731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeCloseAllPidFilters 741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J)V 751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 7665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick ChalkoJNIEXPORT void JNICALL Java_com_android_tv_tuner_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/* 8565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Class: com_android_tv_tuner_TunerHal 861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeStopTune 871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J)V 881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 891abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL 9065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick ChalkoJava_com_android_tv_tuner_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/* 9965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Class: com_android_tv_tuner_TunerHal 1001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeAddPidFilter 1011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (JII)V 1021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1031abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT void JNICALL 10465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick ChalkoJava_com_android_tv_tuner_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/* 11365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Class: com_android_tv_tuner_TunerHal 1141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Method: nativeWriteInBuffer 1151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Signature: (J[BI)I 1161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1171abddd9f6225298066094e20a6c29061b6af4590Nick ChalkoJNIEXPORT jint JNICALL 11865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick ChalkoJava_com_android_tv_tuner_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} 14465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 14565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/* 14665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Class: com_android_tv_tuner_TunerHal 14765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Method: nativeSetHasPendingTune 14865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Signature: (JZ)V 14965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 15065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick ChalkoJNIEXPORT void JNICALL 15165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick ChalkoJava_com_android_tv_tuner_TunerHal_nativeSetHasPendingTune 15265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko(JNIEnv *env, jobject thiz, jlong deviceId, jboolean hasPendingTune) { 15365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId); 15465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (it != sDvbManagers.end()) { 15565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko it->second->setHasPendingTune(hasPendingTune); 15665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 15765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko} 1586ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 1596ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko/* 1606ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * Class: com_android_tv_tuner_TunerHal 1616ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * Method: nativeGetDeliverySystemType 1626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * Signature: (J)I 1636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko */ 1646ebde20b03db4c0d57f67acaac11832b610b966bNick ChalkoJNIEXPORT int JNICALL 1656ebde20b03db4c0d57f67acaac11832b610b966bNick ChalkoJava_com_android_tv_tuner_TunerHal_nativeGetDeliverySystemType 1666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko(JNIEnv *env, jobject thiz, jlong deviceId) { 1676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko std::map<jlong, DvbManager *>::iterator it = sDvbManagers.find(deviceId); 1686ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (it != sDvbManagers.end()) { 1696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko return it->second->getDeliverySystemType(env, thiz); 1706ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } else { 1716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko DvbManager *dvbManager = new DvbManager(env, thiz); 1726ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko sDvbManagers.insert(std::pair<jlong, DvbManager *>(deviceId, dvbManager)); 1736ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko return dvbManager->getDeliverySystemType(env, thiz); 1746ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1756ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko}