summaryrefslogtreecommitdiff
path: root/demux.cpp
blob: c36508ffb874dd1657ac51d51ba314b15185ffdc (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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 * demux.cpp: A plugin for the Video Disk Recorder
 *
 * See the README file for copyright information and how to reach the author.
 *
 * $Id$
 */

#include "demux.h"

cMarkAdDemux::cMarkAdDemux(int RecvNumber)
{
    recvnumber=RecvNumber;
    ts2pkt=NULL;
    vdr2pkt=NULL;
    pes2audioes=NULL;
    pes2videoes=NULL;
    queue = new cMarkAdPaketQueue(RecvNumber,"Demux");
}

cMarkAdDemux::~cMarkAdDemux()
{
    if (ts2pkt) delete ts2pkt;
    if (vdr2pkt) delete vdr2pkt;
    if (pes2audioes) delete pes2audioes;
    if (pes2videoes) delete pes2videoes;
    if (queue) delete queue;
}

void cMarkAdDemux::ProcessVDR(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen)
{
    if ((!Pkt) || (!PktLen)) return;
    *Pkt=NULL;
    *PktLen=0;

    uchar *pkt;
    int pktlen;

    if (!vdr2pkt) vdr2pkt= new cMarkAdVDR2Pkt(recvnumber);
    if (!vdr2pkt) return;

    vdr2pkt->Process(Pid,Data,Count,&pkt,&pktlen);

    if ((Pid.Type==MARKAD_PIDTYPE_AUDIO_AC3) || (Pid.Type==MARKAD_PIDTYPE_AUDIO_MP2))
    {
        if (!pes2audioes) pes2audioes=new cMarkAdPES2ES(recvnumber,"PES2ES audio");
        if (!pes2audioes) return;
        pes2audioes->Process(Pid,pkt,pktlen,Pkt,PktLen);
        return;
    }

    if ((Pid.Type==MARKAD_PIDTYPE_VIDEO_H262) || (Pid.Type==MARKAD_PIDTYPE_VIDEO_H264))
    {
        if (!pes2videoes) pes2videoes=new cMarkAdPES2ES(recvnumber,"PES2ES video",262144);
        if (!pes2videoes) return;
        pes2videoes->Process(Pid,pkt,pktlen,Pkt,PktLen);
        return;
    }
    return;
}

void cMarkAdDemux::ProcessTS(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen)
{
    if ((!Pkt) || (!PktLen) || (!Data)) return;
    *Pkt=NULL;
    *PktLen=0;

    uchar *pkt;
    int pktlen;

    if (!ts2pkt) ts2pkt=new cMarkAdTS2Pkt(recvnumber);
    if (!ts2pkt) return;

    ts2pkt->Process(Pid,Data,Count,&pkt,&pktlen);

    if ((Pid.Type==MARKAD_PIDTYPE_AUDIO_AC3) || (Pid.Type==MARKAD_PIDTYPE_AUDIO_MP2))
    {
        if (!pes2audioes) pes2audioes=new cMarkAdPES2ES(recvnumber,"PES2ES audio");
        if (!pes2audioes) return;
        pes2audioes->Process(Pid,pkt,pktlen,Pkt,PktLen);
        return;
    }

    if (pkt)
    {
        *Pkt=pkt;
        *PktLen=pktlen;
    }
    return;
}

int cMarkAdDemux::Process(MarkAdPid Pid, uchar *Data, int Count, uchar **Pkt, int *PktLen)
{
    if ((!Data) && (!Count) && (!Pkt) || (!PktLen)) return -1;

    *Pkt=NULL;
    *PktLen=0;

    int retval;
    int min_needed=TS_SIZE;

    int needed=min_needed-queue->Length();
    if (Count>needed)
    {
        queue->Put(Data,needed);
        retval=needed;
    }
    else
    {
        queue->Put(Data,Count);
        retval=Count;
    }
    if (queue->Length()<min_needed) return Count;

    uchar *in;
    int inlen=TS_SIZE;
    in=queue->Get(&inlen);

    if (Pid.Num>=0)
    {
        ProcessTS(Pid, in, inlen, Pkt, PktLen);
    }
    else
    {
        ProcessVDR(Pid, in, inlen, Pkt, PktLen);
    }
    return retval;
}