2016년 3월 13일 일요일

Gear VR 로 TV 보기 - 6편 (libhdhomerun 으로 채널 설정)


Cerbero 를 사용해서 libhdhomerun 을 안드로이드 세계로 끌고 들어 왔으니 이제 사용하는 것만 남았다.

jni/tutorial-5.c 파일에 hdhomerun api 를 사용해서 방송 수신을 위한 작업을 추가 하면 된다.
우선 libhdhomerun 을 사용하기 위해 자료 구조를 추가해 주고 아래 작업을 해 준다.

 typedef struct _CustomData {
   jobject app;                  /* Application instance, used to call its methods. A global reference is kept. */
   GstElement *pipeline;         /* The running pipeline */
...
   GstClockTime last_seek_time;  /* For seeking overflow prevention (throttling) */
   gboolean is_live;             /* Live streams do not use buffering */
+  struct hdhomerun_device_t *hd;
+  struct hdhomerun_discover_device_t ResultList[64];
+  struct hdhomerun_channel_list_t *ChannelList;

 } CustomData;

1. 튜너를 찾는다.

 - hdhomerun_discover_find_devices_custom_v2 로 현재 네트웍에 있는 튜너를 찾는다.

static void gst_native_init (JNIEnv* env, jobject thiz) {
...
+  int Count = hdhomerun_discover_find_devices_custom_v2(0, HDHOMERUN_DEVICE_TYPE_TUNER, HDHOMERUN_DEVICE_ID_WILDCARD, data->ResultList, 64);
+  if (Count < 0) {
+    set_ui_message ("DetectDiscover error finding HDHomerun", data);
+    return;
+  }
+  if (Count == 0) {
+    set_ui_message ("devices: DetectDiscover no devices found");
+    return;
+  } else {
+    set_ui_message ("there's HDHomerun", data);
+  }
+
+  char cName[16];
+  snprintf(cName, sizeof(cName), "%08lX", (unsigned long)data->ResultList[0].device_id);
+  data->hd = (struct hdhomerun_device_t *) hdhomerun_device_create(data->ResultList[0].device_id, data->ResultList[0].ip_addr, 0, 0);

2. 채널을 설정 한다.

 - hdhomerun_device_set_tuner_channel 에 스캔정보를 참조해서 채널 번호를 넣는다.

+  char channelspec[8];
+  sprintf(channelspec, "auto:%i", 82);
+  if (hdhomerun_device_set_tuner_channel(data->hd, channelspec)) {
+    set_ui_message ("set cahnnel to EBS", data);
+  } else {
+    set_ui_message ("failed to set cahnnel to EBS", data);
+  }

3. 프로그램을 설정한다.

 - 역시 스캔 정보를 참조해서 프로그램 정보를 입력한다.

+  char Program[64];
+  sprintf(Program, "%u", 1);
+  if (hdhomerun_device_set_tuner_program(data->hd, Program) < 0) {
+    set_ui_message ("failed to set program");
+  } else {
+    set_ui_message ("set program");
+  }

4. 송신을 시작한다.

 - 안드로이드 타겟의 ip 와 port 를 설정해 준다.

+  char target[64];
+  snprintf(target, sizeof(target), "192.168.1.208:1234");
+  if (hdhomerun_device_set_tuner_target(data->hd, target)>0){
+    set_ui_message ("start streaming", data);
+  } else {
+    set_ui_message ("failed to set target");
+  }
위 예제는 수동으로 채널과 프로그램 번호를 하드코딩 했지만 scan api 를 사용해서 db 를 만들고 채널 탐색을 하는 것도 같은 방식으로 추가 가능하다. 자세한 내용은 libhdhomerun api 를 참고하면 된다. 차후에 swipe 를 통해 channel up/down 을 구현하겠지만 지금은 libhdhomerun 통합에 초점을 맞췄기 때문에 여기까지만.

이제 app 을 실행 하면서 hdhomerun 으로 부터 방송을 수신해서 2D 방송을 시청할 수 있게 되었다. 다음 작업은 side-by-side 로 화면을 바꿔서 드디어 gear vr 에서 방송을 볼 수 있게 하는 것이다. 두근두근...

댓글 없음: