aboutsummaryrefslogtreecommitdiff
path: root/jni/DvbManager.h
blob: 2252332cd3900c4e95d4c6d18a960fecb8aee70f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef DVB_MANAGER_H_
#define DVB_MANAGER_H_

#include <jni.h>
#include <map>

#include "mutex.h"
#include "tunertvinput_jni.h"

class DvbManager {
    static const int NUM_POLLFDS = 1;
    static const int FE_LOCK_CHECK_INTERNAL_US = 100 * 1000;
    static const int FE_CONSECUTIVE_LOCK_SUCCESS_COUNT = 1;
    static const int DVB_ERROR_RETRY_INTERVAL_MS = 100 * 1000;
    static const int DVB_TUNE_STOP_DELAY_MS = 100 * 1000;
    static const int FE_POLL_TIMEOUT_MS = 100;
    static const int PAT_PID = 0;
    static const int DVB_API_VERSION_UNDEFINED = -1;
    static const int DVB_API_VERSION3 = 3;
    static const int DVB_API_VERSION5 = 5;

    static const int FILTER_TYPE_OTHER =
            com_android_tv_tuner_TunerHal_FILTER_TYPE_OTHER;
    static const int FILTER_TYPE_AUDIO =
            com_android_tv_tuner_TunerHal_FILTER_TYPE_AUDIO;
    static const int FILTER_TYPE_VIDEO =
            com_android_tv_tuner_TunerHal_FILTER_TYPE_VIDEO;
    static const int FILTER_TYPE_PCR =
            com_android_tv_tuner_TunerHal_FILTER_TYPE_PCR;

    static const int DELIVERY_SYSTEM_UNDEFINED =
            com_android_tv_tuner_TunerHal_DELIVERY_SYSTEM_UNDEFINED;
    static const int DELIVERY_SYSTEM_ATSC =
            com_android_tv_tuner_TunerHal_DELIVERY_SYSTEM_ATSC;
    static const int DELIVERY_SYSTEM_DVBC =
            com_android_tv_tuner_TunerHal_DDELIVERY_SYSTEM_DVBC;
    static const int DELIVERY_SYSTEM_DVBS =
            com_android_tv_tuner_TunerHal_DELIVERY_SYSTEM_DVBS;
    static const int DELIVERY_SYSTEM_DVBS2 =
            com_android_tv_tuner_TunerHal_DELIVERY_SYSTEM_DVBS2;
    static const int DELIVERY_SYSTEM_DVBT =
            com_android_tv_tuner_TunerHal_DELIVERY_SYSTEM_DVBT;
    static const int DELIVERY_SYSTEM_DVBT2 =
            com_android_tv_tuner_TunerHal_DELIVERY_SYSTEM_DVBT2;


    int mFeFd;
    int mDemuxFd;
    int mDvrFd;
    int mPatFilterFd;
    int mDvbApiVersion;
    int mDeliverySystemType;
    bool mFeHasLock;
    // Flag for pending tune request. Used for canceling the current tune operation.
    bool volatile mHasPendingTune;
    std::map<int, int> mPidFilters;
    Mutex mFilterLock;
    jmethodID mOpenDvbFrontEndMethodID;
    jmethodID mOpenDvbDemuxMethodID;
    jmethodID mOpenDvbDvrMethodID;

public:
    DvbManager(JNIEnv *env, jobject thiz);
    ~DvbManager();
    int tune(JNIEnv *env, jobject thiz,
            const int frequency, const char *modulationStr, int timeout_ms);
    int stopTune();
    int readTsStream(JNIEnv *env, jobject thiz,
            uint8_t *tsBuffer, int tsBufferSize, int timeout_ms);
    int startTsPidFilter(JNIEnv *env, jobject thiz, int pid, int filterType);
    void closeAllDvbPidFilter();
    void setHasPendingTune(bool hasPendingTune);
    int getDeliverySystemType(JNIEnv *env, jobject thiz);

private:
    int openDvbFe(JNIEnv *env, jobject thiz);
    int openDvbDvr(JNIEnv *env, jobject thiz);
    void closePatFilter();
    void closeDvbFe();
    void closeDvbDvr();
    void reset();
    void resetExceptFe();
    bool isFeLocked();
    // Call to java method
    int openDvbFeFromSystemApi(JNIEnv *env, jobject thiz);
    int openDvbDemuxFromSystemApi(JNIEnv *env, jobject thiz);
    int openDvbDvrFromSystemApi(JNIEnv *env, jobject thiz);
};

#endif  // DVB_MANAGER_H_