Beispiel #1
0
bool ShortVirtualChannelTable::Parse(void)
{
    _ptrs.clear();

    if (kDefinedChannelsMap == TableSubtype())
    {
        _ptrs.push_back(pesdata() + DefinedChannelsMap().Size() + 7);
    }
    else if (kVirtualChannelMap == TableSubtype())
    {
        bool descriptors_included = pesdata()[7] & 0x20;
        uint number_of_vc_records = pesdata()[13];
        const unsigned char *next = pesdata() + 14;
        if (!descriptors_included)
        {
            for (uint i = 0; i < number_of_vc_records; i++)
            {
                _ptrs.push_back(next);
                next += 9;
            }
            _ptrs.push_back(next);
        }
        else
        {
            for (uint i = 0; i < number_of_vc_records; i++)
            {
                _ptrs.push_back(next);
                uint desc_count = next[10];
                next += 10;
                for (uint j = 0; j < desc_count; j++)
                {
                    MPEGDescriptor desc(next);
                    if (!desc.IsValid())
                    {
                        _ptrs.clear();
                        return false;
                    }
                    next += desc.size();
                }
            }
        }
        _ptrs.push_back(next);
    }
    else if (kInverseChannelMap == TableSubtype())
    {
        _ptrs.push_back(pesdata() + InverseChannelMap().Size() + 7);
    }
    else
    {
        return false;
    }

    return true;
}
Beispiel #2
0
bool SCTENetworkInformationTable::Parse(void)
{
    _ptrs.clear();

    if ((kCarrierDefinitionSubtable == TableSubtype()) ||
        (kModulationModeSubtable == TableSubtype()))
    {
        uint offset = (kCarrierDefinitionSubtable == TableSubtype()) ? 6 : 7;
        const unsigned char *next = pesdata() + 7;
        for (uint i = 0; i < NumberOfRecords(); i++)
        {
            _ptrs.push_back(next);
            uint desc_count = next[offset-1];
            next += offset;
            for (uint j = 0; j < desc_count; j++)
            {
                MPEGDescriptor desc(next);
                if (!desc.IsValid())
                {
                    _ptrs.clear();
                    return false;
                }
                next += desc.size();
            }
        }
        _ptrs.push_back(next);
        return true;
    }

    return false;
}
Beispiel #3
0
QString VirtualChannelTable::toStringXML(uint indent_level) const
{
    QString indent_0 = xml_indent(indent_level);
    QString indent_1 = xml_indent(indent_level + 1);
    QString indent_2 = xml_indent(indent_level + 2);

    QString section_name = QString("%1VirtualChannelSection")
        .arg((TableID::TVCT == TableID()) ? "Terrestrial" : "Cable");

    QString mapid;
    if (TableID::CVCT == TableID())
    {
        uint sctemapid = (pesdata()[3]<<8) | pesdata()[4];
        mapid = QString(" mapid=\"0x%1\"").arg(sctemapid,4,16,QChar('0'));
    }

    QString str =
        QString("%1<%2 tsid=\"0x%3\" channel_count=\"%4\""
                "\n%5global_descriptors_length=\"%6\"%7"
                "\n%8%9>\n")
        .arg(indent_0)
        .arg(section_name)
        .arg(TransportStreamID(),4,16,QChar('0'))
        .arg(ChannelCount())
        .arg(indent_1)
        .arg(GlobalDescriptorsLength())
        .arg(mapid)
        .arg(indent_1)
        .arg(PSIPTable::XMLValues(indent_level + 1));

    vector<const unsigned char*> gdesc =
        MPEGDescriptor::Parse(GlobalDescriptors(), GlobalDescriptorsLength());
    for (uint i = 0; i < gdesc.size(); i++)
    {
        str += MPEGDescriptor(gdesc[i], 300)
            .toStringXML(indent_level + 1) + "\n";
    }

    for (uint i = 0; i < ChannelCount(); i++)
        str += ChannelStringXML(indent_level + 1, i) + "\n";

    return str + indent_0 + QString("</%1>").arg(section_name);
}
Beispiel #4
0
QString VirtualChannelTable::toString(void) const
{
    QString str;
    str.append(QString("%1 Virtual Channel Section\n%2"
                       "      channel_count(%3) tsid(0x%4)")
               .arg((TableID::TVCT == TableID()) ? "Terrestrial":"Cable")
               .arg(PSIPTable::toString())
               .arg(ChannelCount())
               .arg(TransportStreamID(),4,16,QChar('0')));

    if (TableID::CVCT == TableID())
    {
        uint sctemapid = (pesdata()[3]<<8) | pesdata()[4];
        str.append(QString(" mapid(0x%1)").arg(sctemapid,0,16));
    }

    str.append("\n");

    for (uint i = 0; i < ChannelCount(); i++)
        str.append(ChannelString(i));

    if (0 != GlobalDescriptorsLength())
    {
        str.append(QString("global descriptors length(%1) ")
                   .arg(GlobalDescriptorsLength()));
        vector<const unsigned char*> desc =
            MPEGDescriptor::Parse(GlobalDescriptors(),
                                  GlobalDescriptorsLength());
        str.append(QString("count: %1\n").arg(desc.size()));
        for (uint i = 0; i < desc.size(); i++)
        {
            str.append(QString(" %1\n")
                       .arg(MPEGDescriptor(desc[i]).toString()));
        }
    }

    return str;
}