15 #include <linux/videodev2.h>
16 #include <linux/dvb/audio.h>
17 #include <linux/dvb/dmx.h>
18 #include <linux/dvb/video.h>
19 #include <sys/ioctl.h>
64 ioctl(
fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX);
76 memset(&hdmiConfig, 0,
sizeof(hdmiConfig));
150 if (ioctl(
fd_video, VIDEO_GET_SIZE, &vs) == 0) {
151 if (vs.h == 480 || vs.h == 240)
164 if (ioctl(
fd_video, VIDEO_GET_SIZE, &vs) == 0) {
167 switch (vs.aspect_ratio) {
169 case VIDEO_FORMAT_4_3: VideoAspect = 4.0 / 3.0;
break;
170 case VIDEO_FORMAT_16_9: VideoAspect = 16.0 / 9.0;
break;
171 case VIDEO_FORMAT_221_1: VideoAspect = 2.21;
break;
190 dmx_pes_filter_params pesFilterParams;
191 memset(&pesFilterParams, 0,
sizeof(pesFilterParams));
224 if (!(Type <= ptDolby && Handle->used <= 1)) {
225 pesFilterParams.pid = Handle->
pid;
226 pesFilterParams.input = DMX_IN_FRONTEND;
227 pesFilterParams.output = DMX_OUT_TS_TAP;
228 pesFilterParams.pes_type= DMX_PES_OTHER;
229 pesFilterParams.flags = DMX_IMMEDIATE_START;
230 if (ioctl(Handle->
handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
236 else if (!Handle->
used) {
271 int apid = Channel->
Apid(0);
272 int vpid = Channel->
Vpid();
273 int dpid = Channel->
Dpid(0);
280 bool TurnOffLivePIDs = DoTune
287 && (LiveView &&
HasPid(vpid ? vpid : apid) && (!pidHandlesVideo || (!pidHandlesAudio && (dpid ?
pidHandles[
ptAudio].
pid != dpid :
true)))
288 || !LiveView && (pidHandlesVideo || pidHandlesAudio)
295 bool TurnOnLivePIDs = !StartTransferMode && LiveView;
309 if (TurnOnLivePIDs) {
315 else if (StartTransferMode)
346 if (TrackId && TrackId->
id) {
387 ioctl(
fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX);
409 ioctl(
fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY);
419 if (ioctl(
fd_video, VIDEO_GET_PTS, &pts) == -1) {
427 if (ioctl(
fd_audio, AUDIO_GET_PTS, &pts) == -1) {
495 if (Data[0] == 0x47) {
499 else if (Data[0] == 0x00 && Data[1] == 0x00 && Data[2] == 0x01 && (Data[3] & 0xF0) == 0xE0) {
501 char *buf =
MALLOC(
char, Length);
506 while (i < Length - 6) {
507 if (Data[i] == 0x00 && Data[i + 1] == 0x00 && Data[i + 2] == 0x01) {
508 int len = Data[i + 4] * 256 + Data[i + 5];
509 if ((Data[i + 3] & 0xF0) == 0xE0) {
513 if ((Data[i + 6] & 0xC0) == 0x80) {
515 if (Data[i + 8] >= Length)
521 if (len < 0 || offs + len > Length)
526 while (offs < Length && len > 0 && Data[offs] == 0xFF) {
530 if (offs <= Length - 2 && len >= 2 && (Data[offs] & 0xC0) == 0x40) {
534 if (offs <= Length - 5 && len >= 5 && (Data[offs] & 0xF0) == 0x20) {
538 else if (offs <= Length - 10 && len >= 10 && (Data[offs] & 0xF0) == 0x30) {
542 else if (offs < Length && len > 0) {
547 if (blen + len > Length)
549 memcpy(&buf[blen], &Data[offs], len);
553 else if (Data[i + 3] >= 0xBD && Data[i + 3] <= 0xDF)
573 return Poller.
Poll(TimeoutMs);
585 TsBuffer[1] = PusiSet ? 0x40 : 0x00;
586 TsBuffer[1] |= Pid >> 8;
587 TsBuffer[2] = Pid & 0xFF;
590 TsBuffer[3] = 0x10 | Counter;
591 memcpy(TsBuffer + 4, Data, 184);
595 uint8_t adaptationLength;
597 TsBuffer[3] = 0x30 | Counter;
598 adaptationLength = 183 - Length;
599 TsBuffer[4] = adaptationLength;
600 if (adaptationLength > 0)
603 memset(TsBuffer + 6, 0xFF, adaptationLength - 1);
605 memcpy(TsBuffer + 5 + adaptationLength, Data, Length);
618 BuildTsPacket(TsBuffer + tsOffset, i == 0, Pid, Counter, Data + i * 184, Length);
623 Counter = (Counter + 1) & 15;
664 if (streamId >= 0xC0 && streamId <= 0xDF)
668 else if (streamId == 0xBD)
670 const uint8_t * payload = Data + 9 + Data[8];
671 if ((payload[0] & 0xF8) == 0xA0)
676 else if ((payload[0] & 0xF8) == 0x88)
681 else if ((payload[0] & 0xF8) == 0x80)
691 pid = 200 + (int) streamType;
707 int pid =
TsPid(Data);
737 int pid =
TsPid(Data);
740 int AudioStreamType = -1;
747 if (AudioStreamType < 0) {
775 static uint32_t SubsystemIds[] = {
783 uint32_t SubsystemId = 0;
784 FileName =
cString::sprintf(
"/sys/class/dvb/dvb%d.frontend%d/device/subsystem_vendor", Adapter, Frontend);
785 if ((f = fopen(FileName,
"r")) != NULL) {
786 if (
char *s = ReadLine.
Read(f))
787 SubsystemId = strtoul(s, NULL, 0) << 16;
790 FileName =
cString::sprintf(
"/sys/class/dvb/dvb%d.frontend%d/device/subsystem_device", Adapter, Frontend);
791 if ((f = fopen(FileName,
"r")) != NULL) {
792 if (
char *s = ReadLine.
Read(f))
793 SubsystemId |= strtoul(s, NULL, 0);
796 for (uint32_t *sid = SubsystemIds; *sid; sid++) {
797 if (*sid == SubsystemId) {
799 int fd = open(FileName, O_RDWR);
802 dsyslog(
"creating cDvbHdFfDevice");