Loading media/java/android/media/tv/tuner/filter/Filter.java +20 −3 Original line number Original line Diff line number Diff line Loading @@ -22,7 +22,9 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.SystemApi; import android.hardware.tv.tuner.V1_0.Constants; import android.hardware.tv.tuner.V1_0.Constants; import android.media.tv.tuner.Tuner; import android.media.tv.tuner.Tuner.Result; import android.media.tv.tuner.Tuner.Result; import android.media.tv.tuner.TunerUtils; import java.lang.annotation.Retention; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy; Loading Loading @@ -178,13 +180,14 @@ public class Filter implements AutoCloseable { */ */ public static final int STATUS_OVERFLOW = Constants.DemuxFilterStatus.OVERFLOW; public static final int STATUS_OVERFLOW = Constants.DemuxFilterStatus.OVERFLOW; private long mNativeContext; private long mNativeContext; private FilterCallback mCallback; private FilterCallback mCallback; private Executor mExecutor; private Executor mExecutor; private final int mId; private final int mId; private int mMainType; private int mMainType; private int mSubtype; private int mSubtype; private Filter mSource; private boolean mStarted; private native int nativeConfigureFilter( private native int nativeConfigureFilter( int type, int subType, FilterConfiguration settings); int type, int subType, FilterConfiguration settings); Loading @@ -202,6 +205,9 @@ public class Filter implements AutoCloseable { } } private void onFilterStatus(int status) { private void onFilterStatus(int status) { if (mCallback != null && mExecutor != null) { mExecutor.execute(() -> mCallback.onFilterStatusChanged(this, status)); } } } private void onFilterEvent(FilterEvent[] events) { private void onFilterEvent(FilterEvent[] events) { Loading Loading @@ -266,10 +272,18 @@ public class Filter implements AutoCloseable { * @param source the filter instance which provides data input. Switch to * @param source the filter instance which provides data input. Switch to * use demux as data source if the filter instance is NULL. * use demux as data source if the filter instance is NULL. * @return result status of the operation. * @return result status of the operation. * @throws IllegalStateException if the data source has been set. */ */ @Result @Result public int setDataSource(@Nullable Filter source) { public int setDataSource(@Nullable Filter source) { return nativeSetDataSource(source); if (mSource != null) { throw new IllegalStateException("Data source is existing"); } int res = nativeSetDataSource(source); if (res == Tuner.RESULT_SUCCESS) { mSource = source; } return res; } } /** /** Loading Loading @@ -328,6 +342,9 @@ public class Filter implements AutoCloseable { */ */ @Override @Override public void close() { public void close() { nativeClose(); int res = nativeClose(); if (res != Tuner.RESULT_SUCCESS) { TunerUtils.throwExceptionForResult(res, "Failed to close filter."); } } } } } media/jni/android_media_tv_Tuner.cpp +87 −44 Original line number Original line Diff line number Diff line Loading @@ -2448,11 +2448,11 @@ static DemuxFilterSettings getFilterConfiguration( return filterSettings; return filterSettings; } } static int copyData(JNIEnv *env, sp<Filter> filter, jbyteArray buffer, jint offset, int size) { static jint copyData(JNIEnv *env, sp<Filter> filter, jbyteArray buffer, jlong offset, jlong size) { ALOGD("copyData, size=%d, offset=%d", size, offset); ALOGD("copyData, size=%ld, offset=%ld", (long) size, (long) offset); int available = filter->mFilterMQ->availableToRead(); jlong available = filter->mFilterMQ->availableToRead(); ALOGD("copyData, available=%d", available); ALOGD("copyData, available=%ld", (long) available); size = std::min(size, available); size = std::min(size, available); jboolean isCopy; jboolean isCopy; Loading @@ -2474,7 +2474,7 @@ static int copyData(JNIEnv *env, sp<Filter> filter, jbyteArray buffer, jint offs return size; return size; } } static int android_media_tv_Tuner_configure_filter( static jint android_media_tv_Tuner_configure_filter( JNIEnv *env, jobject filter, int type, int subtype, jobject settings) { JNIEnv *env, jobject filter, int type, int subtype, jobject settings) { ALOGD("configure filter type=%d, subtype=%d", type, subtype); ALOGD("configure filter type=%d, subtype=%d", type, subtype); sp<Filter> filterSp = getFilter(env, filter); sp<Filter> filterSp = getFilter(env, filter); Loading @@ -2485,9 +2485,14 @@ static int android_media_tv_Tuner_configure_filter( } } DemuxFilterSettings filterSettings = getFilterConfiguration(env, type, subtype, settings); DemuxFilterSettings filterSettings = getFilterConfiguration(env, type, subtype, settings); Result res = iFilterSp->configure(filterSettings); Result res = iFilterSp->configure(filterSettings); if (res != Result::SUCCESS) { return (jint) res; } MQDescriptorSync<uint8_t> filterMQDesc; MQDescriptorSync<uint8_t> filterMQDesc; if (res == Result::SUCCESS && filterSp->mFilterMQ == NULL) { Result getQueueDescResult = Result::UNKNOWN_ERROR; Result getQueueDescResult = Result::UNKNOWN_ERROR; if (filterSp->mFilterMQ == NULL) { iFilterSp->getQueueDesc( iFilterSp->getQueueDesc( [&](Result r, const MQDescriptorSync<uint8_t>& desc) { [&](Result r, const MQDescriptorSync<uint8_t>& desc) { filterMQDesc = desc; filterMQDesc = desc; Loading @@ -2500,59 +2505,97 @@ static int android_media_tv_Tuner_configure_filter( filterSp->mFilterMQ->getEventFlagWord(), &(filterSp->mFilterMQEventFlag)); filterSp->mFilterMQ->getEventFlagWord(), &(filterSp->mFilterMQEventFlag)); } } } } return (int)res; return (jint) getQueueDescResult; } } static int android_media_tv_Tuner_get_filter_id(JNIEnv*, jobject) { static jint android_media_tv_Tuner_get_filter_id(JNIEnv* env, jobject filter) { return 0; sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (iFilterSp == NULL) { ALOGD("Failed to get filter ID: filter not found"); return (int) Result::INVALID_STATE; } Result res; uint32_t id; iFilterSp->getId( [&](Result r, uint32_t filterId) { res = r; id = filterId; }); if (res != Result::SUCCESS) { return (jint) Constant::INVALID_FILTER_ID; } return (jint) id; } } static int android_media_tv_Tuner_set_filter_data_source(JNIEnv*, jobject, jobject) { static jint android_media_tv_Tuner_set_filter_data_source( return 0; JNIEnv* env, jobject filter, jobject srcFilter) { sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (iFilterSp == NULL) { ALOGD("Failed to set filter data source: filter not found"); return (jint) Result::INVALID_STATE; } Result r; if (srcFilter == NULL) { r = iFilterSp->setDataSource(NULL); } else { sp<IFilter> srcSp = getFilter(env, srcFilter)->getIFilter(); if (iFilterSp == NULL) { ALOGD("Failed to set filter data source: src filter not found"); return (jint) Result::INVALID_STATE; } r = iFilterSp->setDataSource(srcSp); } return (jint) r; } } static int android_media_tv_Tuner_start_filter(JNIEnv *env, jobject filter) { static jint android_media_tv_Tuner_start_filter(JNIEnv *env, jobject filter) { sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (filterSp == NULL) { if (iFilterSp == NULL) { ALOGD("Failed to start filter: filter not found"); ALOGD("Failed to start filter: filter not found"); return false; return (jint) Result::INVALID_STATE; } } Result r = filterSp->start(); Result r = iFilterSp->start(); return (int) r; return (jint) r; } } static int android_media_tv_Tuner_stop_filter(JNIEnv *env, jobject filter) { static jint android_media_tv_Tuner_stop_filter(JNIEnv *env, jobject filter) { sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (filterSp == NULL) { if (iFilterSp == NULL) { ALOGD("Failed to stop filter: filter not found"); ALOGD("Failed to stop filter: filter not found"); return false; return (jint) Result::INVALID_STATE; } } Result r = filterSp->stop(); Result r = iFilterSp->stop(); return (int) r; return (jint) r; } } static int android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) { static jint android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) { sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (filterSp == NULL) { if (iFilterSp == NULL) { ALOGD("Failed to flush filter: filter not found"); ALOGD("Failed to flush filter: filter not found"); return false; return (jint) Result::INVALID_STATE; } } Result r = filterSp->flush(); Result r = iFilterSp->flush(); return (int) r; return (jint) r; } } static int android_media_tv_Tuner_read_filter_fmq( static jint android_media_tv_Tuner_read_filter_fmq( JNIEnv *env, jobject filter, jbyteArray buffer, jlong offset, jlong size) { JNIEnv *env, jobject filter, jbyteArray buffer, jlong offset, jlong size) { sp<Filter> filterSp = getFilter(env, filter); sp<Filter> filterSp = getFilter(env, filter); if (filterSp == NULL) { if (filterSp == NULL) { ALOGD("Failed to read filter FMQ: filter not found"); ALOGD("Failed to read filter FMQ: filter not found"); return 0; return (jint) Result::INVALID_STATE; } } return copyData(env, filterSp, buffer, offset, size); return copyData(env, filterSp, buffer, offset, size); } } static int android_media_tv_Tuner_close_filter(JNIEnv*, jobject) { static jint android_media_tv_Tuner_close_filter(JNIEnv *env, jobject filter) { return 0; sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (iFilterSp == NULL) { ALOGD("Failed to close filter: filter not found"); return (jint) Result::INVALID_STATE; } Result r = iFilterSp->close(); return (jint) r; } } static sp<TimeFilter> getTimeFilter(JNIEnv *env, jobject filter) { static sp<TimeFilter> getTimeFilter(JNIEnv *env, jobject filter) { Loading Loading @@ -2660,8 +2703,8 @@ static int android_media_tv_Tuner_add_pid( if (descramblerSp == NULL) { if (descramblerSp == NULL) { return false; return false; } } sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), filterSp); Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), iFilterSp); return (int)result; return (int)result; } } Loading @@ -2671,8 +2714,8 @@ static int android_media_tv_Tuner_remove_pid( if (descramblerSp == NULL) { if (descramblerSp == NULL) { return false; return false; } } sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), filterSp); Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), iFilterSp); return (int)result; return (int)result; } } Loading Loading @@ -2702,21 +2745,21 @@ static jobject android_media_tv_Tuner_get_demux_caps(JNIEnv*, jobject) { static int android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) { static int android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) { sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr(); sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr(); sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (dvrSp == NULL || filterSp == NULL) { if (dvrSp == NULL || iFilterSp == NULL) { return false; return false; } } Result result = dvrSp->attachFilter(filterSp); Result result = dvrSp->attachFilter(iFilterSp); return (int) result; return (int) result; } } static int android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) { static int android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) { sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr(); sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr(); sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (dvrSp == NULL || filterSp == NULL) { if (dvrSp == NULL || iFilterSp == NULL) { return false; return false; } } Result result = dvrSp->detachFilter(filterSp); Result result = dvrSp->detachFilter(iFilterSp); return (int) result; return (int) result; } } Loading Loading
media/java/android/media/tv/tuner/filter/Filter.java +20 −3 Original line number Original line Diff line number Diff line Loading @@ -22,7 +22,9 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.SystemApi; import android.hardware.tv.tuner.V1_0.Constants; import android.hardware.tv.tuner.V1_0.Constants; import android.media.tv.tuner.Tuner; import android.media.tv.tuner.Tuner.Result; import android.media.tv.tuner.Tuner.Result; import android.media.tv.tuner.TunerUtils; import java.lang.annotation.Retention; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy; Loading Loading @@ -178,13 +180,14 @@ public class Filter implements AutoCloseable { */ */ public static final int STATUS_OVERFLOW = Constants.DemuxFilterStatus.OVERFLOW; public static final int STATUS_OVERFLOW = Constants.DemuxFilterStatus.OVERFLOW; private long mNativeContext; private long mNativeContext; private FilterCallback mCallback; private FilterCallback mCallback; private Executor mExecutor; private Executor mExecutor; private final int mId; private final int mId; private int mMainType; private int mMainType; private int mSubtype; private int mSubtype; private Filter mSource; private boolean mStarted; private native int nativeConfigureFilter( private native int nativeConfigureFilter( int type, int subType, FilterConfiguration settings); int type, int subType, FilterConfiguration settings); Loading @@ -202,6 +205,9 @@ public class Filter implements AutoCloseable { } } private void onFilterStatus(int status) { private void onFilterStatus(int status) { if (mCallback != null && mExecutor != null) { mExecutor.execute(() -> mCallback.onFilterStatusChanged(this, status)); } } } private void onFilterEvent(FilterEvent[] events) { private void onFilterEvent(FilterEvent[] events) { Loading Loading @@ -266,10 +272,18 @@ public class Filter implements AutoCloseable { * @param source the filter instance which provides data input. Switch to * @param source the filter instance which provides data input. Switch to * use demux as data source if the filter instance is NULL. * use demux as data source if the filter instance is NULL. * @return result status of the operation. * @return result status of the operation. * @throws IllegalStateException if the data source has been set. */ */ @Result @Result public int setDataSource(@Nullable Filter source) { public int setDataSource(@Nullable Filter source) { return nativeSetDataSource(source); if (mSource != null) { throw new IllegalStateException("Data source is existing"); } int res = nativeSetDataSource(source); if (res == Tuner.RESULT_SUCCESS) { mSource = source; } return res; } } /** /** Loading Loading @@ -328,6 +342,9 @@ public class Filter implements AutoCloseable { */ */ @Override @Override public void close() { public void close() { nativeClose(); int res = nativeClose(); if (res != Tuner.RESULT_SUCCESS) { TunerUtils.throwExceptionForResult(res, "Failed to close filter."); } } } } }
media/jni/android_media_tv_Tuner.cpp +87 −44 Original line number Original line Diff line number Diff line Loading @@ -2448,11 +2448,11 @@ static DemuxFilterSettings getFilterConfiguration( return filterSettings; return filterSettings; } } static int copyData(JNIEnv *env, sp<Filter> filter, jbyteArray buffer, jint offset, int size) { static jint copyData(JNIEnv *env, sp<Filter> filter, jbyteArray buffer, jlong offset, jlong size) { ALOGD("copyData, size=%d, offset=%d", size, offset); ALOGD("copyData, size=%ld, offset=%ld", (long) size, (long) offset); int available = filter->mFilterMQ->availableToRead(); jlong available = filter->mFilterMQ->availableToRead(); ALOGD("copyData, available=%d", available); ALOGD("copyData, available=%ld", (long) available); size = std::min(size, available); size = std::min(size, available); jboolean isCopy; jboolean isCopy; Loading @@ -2474,7 +2474,7 @@ static int copyData(JNIEnv *env, sp<Filter> filter, jbyteArray buffer, jint offs return size; return size; } } static int android_media_tv_Tuner_configure_filter( static jint android_media_tv_Tuner_configure_filter( JNIEnv *env, jobject filter, int type, int subtype, jobject settings) { JNIEnv *env, jobject filter, int type, int subtype, jobject settings) { ALOGD("configure filter type=%d, subtype=%d", type, subtype); ALOGD("configure filter type=%d, subtype=%d", type, subtype); sp<Filter> filterSp = getFilter(env, filter); sp<Filter> filterSp = getFilter(env, filter); Loading @@ -2485,9 +2485,14 @@ static int android_media_tv_Tuner_configure_filter( } } DemuxFilterSettings filterSettings = getFilterConfiguration(env, type, subtype, settings); DemuxFilterSettings filterSettings = getFilterConfiguration(env, type, subtype, settings); Result res = iFilterSp->configure(filterSettings); Result res = iFilterSp->configure(filterSettings); if (res != Result::SUCCESS) { return (jint) res; } MQDescriptorSync<uint8_t> filterMQDesc; MQDescriptorSync<uint8_t> filterMQDesc; if (res == Result::SUCCESS && filterSp->mFilterMQ == NULL) { Result getQueueDescResult = Result::UNKNOWN_ERROR; Result getQueueDescResult = Result::UNKNOWN_ERROR; if (filterSp->mFilterMQ == NULL) { iFilterSp->getQueueDesc( iFilterSp->getQueueDesc( [&](Result r, const MQDescriptorSync<uint8_t>& desc) { [&](Result r, const MQDescriptorSync<uint8_t>& desc) { filterMQDesc = desc; filterMQDesc = desc; Loading @@ -2500,59 +2505,97 @@ static int android_media_tv_Tuner_configure_filter( filterSp->mFilterMQ->getEventFlagWord(), &(filterSp->mFilterMQEventFlag)); filterSp->mFilterMQ->getEventFlagWord(), &(filterSp->mFilterMQEventFlag)); } } } } return (int)res; return (jint) getQueueDescResult; } } static int android_media_tv_Tuner_get_filter_id(JNIEnv*, jobject) { static jint android_media_tv_Tuner_get_filter_id(JNIEnv* env, jobject filter) { return 0; sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (iFilterSp == NULL) { ALOGD("Failed to get filter ID: filter not found"); return (int) Result::INVALID_STATE; } Result res; uint32_t id; iFilterSp->getId( [&](Result r, uint32_t filterId) { res = r; id = filterId; }); if (res != Result::SUCCESS) { return (jint) Constant::INVALID_FILTER_ID; } return (jint) id; } } static int android_media_tv_Tuner_set_filter_data_source(JNIEnv*, jobject, jobject) { static jint android_media_tv_Tuner_set_filter_data_source( return 0; JNIEnv* env, jobject filter, jobject srcFilter) { sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (iFilterSp == NULL) { ALOGD("Failed to set filter data source: filter not found"); return (jint) Result::INVALID_STATE; } Result r; if (srcFilter == NULL) { r = iFilterSp->setDataSource(NULL); } else { sp<IFilter> srcSp = getFilter(env, srcFilter)->getIFilter(); if (iFilterSp == NULL) { ALOGD("Failed to set filter data source: src filter not found"); return (jint) Result::INVALID_STATE; } r = iFilterSp->setDataSource(srcSp); } return (jint) r; } } static int android_media_tv_Tuner_start_filter(JNIEnv *env, jobject filter) { static jint android_media_tv_Tuner_start_filter(JNIEnv *env, jobject filter) { sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (filterSp == NULL) { if (iFilterSp == NULL) { ALOGD("Failed to start filter: filter not found"); ALOGD("Failed to start filter: filter not found"); return false; return (jint) Result::INVALID_STATE; } } Result r = filterSp->start(); Result r = iFilterSp->start(); return (int) r; return (jint) r; } } static int android_media_tv_Tuner_stop_filter(JNIEnv *env, jobject filter) { static jint android_media_tv_Tuner_stop_filter(JNIEnv *env, jobject filter) { sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (filterSp == NULL) { if (iFilterSp == NULL) { ALOGD("Failed to stop filter: filter not found"); ALOGD("Failed to stop filter: filter not found"); return false; return (jint) Result::INVALID_STATE; } } Result r = filterSp->stop(); Result r = iFilterSp->stop(); return (int) r; return (jint) r; } } static int android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) { static jint android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) { sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (filterSp == NULL) { if (iFilterSp == NULL) { ALOGD("Failed to flush filter: filter not found"); ALOGD("Failed to flush filter: filter not found"); return false; return (jint) Result::INVALID_STATE; } } Result r = filterSp->flush(); Result r = iFilterSp->flush(); return (int) r; return (jint) r; } } static int android_media_tv_Tuner_read_filter_fmq( static jint android_media_tv_Tuner_read_filter_fmq( JNIEnv *env, jobject filter, jbyteArray buffer, jlong offset, jlong size) { JNIEnv *env, jobject filter, jbyteArray buffer, jlong offset, jlong size) { sp<Filter> filterSp = getFilter(env, filter); sp<Filter> filterSp = getFilter(env, filter); if (filterSp == NULL) { if (filterSp == NULL) { ALOGD("Failed to read filter FMQ: filter not found"); ALOGD("Failed to read filter FMQ: filter not found"); return 0; return (jint) Result::INVALID_STATE; } } return copyData(env, filterSp, buffer, offset, size); return copyData(env, filterSp, buffer, offset, size); } } static int android_media_tv_Tuner_close_filter(JNIEnv*, jobject) { static jint android_media_tv_Tuner_close_filter(JNIEnv *env, jobject filter) { return 0; sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (iFilterSp == NULL) { ALOGD("Failed to close filter: filter not found"); return (jint) Result::INVALID_STATE; } Result r = iFilterSp->close(); return (jint) r; } } static sp<TimeFilter> getTimeFilter(JNIEnv *env, jobject filter) { static sp<TimeFilter> getTimeFilter(JNIEnv *env, jobject filter) { Loading Loading @@ -2660,8 +2703,8 @@ static int android_media_tv_Tuner_add_pid( if (descramblerSp == NULL) { if (descramblerSp == NULL) { return false; return false; } } sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), filterSp); Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), iFilterSp); return (int)result; return (int)result; } } Loading @@ -2671,8 +2714,8 @@ static int android_media_tv_Tuner_remove_pid( if (descramblerSp == NULL) { if (descramblerSp == NULL) { return false; return false; } } sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), filterSp); Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), iFilterSp); return (int)result; return (int)result; } } Loading Loading @@ -2702,21 +2745,21 @@ static jobject android_media_tv_Tuner_get_demux_caps(JNIEnv*, jobject) { static int android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) { static int android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) { sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr(); sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr(); sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (dvrSp == NULL || filterSp == NULL) { if (dvrSp == NULL || iFilterSp == NULL) { return false; return false; } } Result result = dvrSp->attachFilter(filterSp); Result result = dvrSp->attachFilter(iFilterSp); return (int) result; return (int) result; } } static int android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) { static int android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) { sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr(); sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr(); sp<IFilter> filterSp = getFilter(env, filter)->getIFilter(); sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter(); if (dvrSp == NULL || filterSp == NULL) { if (dvrSp == NULL || iFilterSp == NULL) { return false; return false; } } Result result = dvrSp->detachFilter(filterSp); Result result = dvrSp->detachFilter(iFilterSp); return (int) result; return (int) result; } } Loading