Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
有線分配システム記述子の対応を追加 (#13)
* 有線分配システム記述子の対応を追加

Co-authored-by: pshufd <pshufd@example.com>
  • Loading branch information
pshufd and pshufd committed Jan 13, 2021
1 parent 911e4c5 commit 6e794bc
Show file tree
Hide file tree
Showing 5 changed files with 128 additions and 0 deletions.
47 changes: 47 additions & 0 deletions LibISDB/Filters/AnalyzerFilter.cpp
Expand Up @@ -1658,6 +1658,53 @@ bool AnalyzerFilter::GetTerrestrialDeliverySystemList(ReturnArg<TerrestrialDeliv
}


bool AnalyzerFilter::GetCableDeliverySystemList(ReturnArg<CableDeliverySystemList> List) const
{
if (!List)
return false;

BlockLock Lock(m_FilterLock);

List->clear();

const NITMultiTable *pNITMultiTable =
m_PIDMapManager.GetMapTarget<NITMultiTable>(PID_NIT);
if ((pNITMultiTable == nullptr) || !pNITMultiTable->IsNITComplete())
return false;

for (uint16_t SectionNo = 0; SectionNo < pNITMultiTable->GetNITSectionCount(); SectionNo++) {
const NITTable *pNITTable = pNITMultiTable->GetNITTable(SectionNo);
if (pNITTable == nullptr)
continue;

for (int i = 0; i < pNITTable->GetTransportStreamCount(); i++) {
const DescriptorBlock *pDescBlock = pNITTable->GetItemDescriptorBlock(i);

if (pDescBlock != nullptr) {
const CableDeliverySystemDescriptor *pCableDesc =
pDescBlock->GetDescriptor<CableDeliverySystemDescriptor>();

if (pCableDesc != nullptr) {
CableDeliverySystemInfo Info;

Info.TransportStreamID = pNITTable->GetTransportStreamID(i);
Info.Frequency = pCableDesc->GetFrequency();
Info.FrameType = pCableDesc->GetFrameType();
Info.FECOuter = pCableDesc->GetFECOuter();
Info.Modulation = pCableDesc->GetModulation();
Info.SymbolRate = pCableDesc->GetSymbolRate();
Info.FECInner = pCableDesc->GetFECInner();

List->push_back(Info);
}
}
}
}

return !List->empty();
}


bool AnalyzerFilter::GetEMMPIDList(ReturnArg<EMMPIDList> List) const
{
if (!List)
Expand Down
12 changes: 12 additions & 0 deletions LibISDB/Filters/AnalyzerFilter.hpp
Expand Up @@ -159,8 +159,19 @@ namespace LibISDB
std::vector<uint16_t> Frequency;
};

struct CableDeliverySystemInfo {
uint16_t TransportStreamID;
uint32_t Frequency;
uint8_t FrameType;
uint8_t FECOuter;
uint8_t Modulation;
uint32_t SymbolRate;
uint8_t FECInner;
};

typedef std::vector<SatelliteDeliverySystemInfo> SatelliteDeliverySystemList;
typedef std::vector<TerrestrialDeliverySystemInfo> TerrestrialDeliverySystemList;
typedef std::vector<CableDeliverySystemInfo> CableDeliverySystemList;

typedef std::vector<uint16_t> EMMPIDList;

Expand Down Expand Up @@ -288,6 +299,7 @@ namespace LibISDB

bool GetSatelliteDeliverySystemList(ReturnArg<SatelliteDeliverySystemList> List) const;
bool GetTerrestrialDeliverySystemList(ReturnArg<TerrestrialDeliverySystemList> List) const;
bool GetCableDeliverySystemList(ReturnArg<CableDeliverySystemList> List) const;

bool GetEMMPIDList(ReturnArg<EMMPIDList> List) const;

Expand Down
1 change: 1 addition & 0 deletions LibISDB/TS/DescriptorBlock.cpp
Expand Up @@ -157,6 +157,7 @@ DescriptorBase * DescriptorBlock::CreateDescriptorInstance(uint8_t Tag)
case NetworkNameDescriptor::TAG : return new NetworkNameDescriptor;
case ServiceListDescriptor::TAG : return new ServiceListDescriptor;
case SatelliteDeliverySystemDescriptor::TAG : return new SatelliteDeliverySystemDescriptor;
case CableDeliverySystemDescriptor::TAG : return new CableDeliverySystemDescriptor;
case ServiceDescriptor::TAG : return new ServiceDescriptor;
case LinkageDescriptor::TAG : return new LinkageDescriptor;
case ShortEventDescriptor::TAG : return new ShortEventDescriptor;
Expand Down
39 changes: 39 additions & 0 deletions LibISDB/TS/Descriptors.cpp
Expand Up @@ -215,6 +215,45 @@ bool SatelliteDeliverySystemDescriptor::StoreContents(const uint8_t *pPayload)



CableDeliverySystemDescriptor::CableDeliverySystemDescriptor()
{
Reset();
}


void CableDeliverySystemDescriptor::Reset()
{
DescriptorBase::Reset();

m_Frequency = 0;
m_FrameType = 0;
m_FECOuter = 0;
m_Modulation = 0;
m_SymbolRate = 0;
m_FECInner = 0;
}


bool CableDeliverySystemDescriptor::StoreContents(const uint8_t *pPayload)
{
if (m_Tag != TAG)
return false;
if (m_Length != 11)
return false;

m_Frequency = GetBCD(&pPayload[0], 8);
m_FrameType = (pPayload[5] >> 4) & 0x0f;
m_FECOuter = pPayload[5] & 0x0f;
m_Modulation = pPayload[6];
m_SymbolRate = GetBCD(&pPayload[7], 7);
m_FECInner = pPayload[10] & 0x0F;

return true;
}




ServiceDescriptor::ServiceDescriptor()
{
Reset();
Expand Down
29 changes: 29 additions & 0 deletions LibISDB/TS/Descriptors.hpp
Expand Up @@ -135,6 +135,35 @@ namespace LibISDB
uint8_t m_FECInner; /**< FEC_inner */
};

/** 有線分配システム記述子クラス */
class CableDeliverySystemDescriptor
: public DescriptorTemplate<CableDeliverySystemDescriptor, 0x44>
{
public:
CableDeliverySystemDescriptor();

// DescriptorBase
void Reset() override;

// CableDeliverySystemDescriptor
uint32_t GetFrequency() const noexcept { return m_Frequency; }
uint8_t GetFrameType() const noexcept { return m_FrameType; }
uint8_t GetFECOuter() const noexcept { return m_FECOuter; }
uint8_t GetModulation() const noexcept { return m_Modulation; }
uint32_t GetSymbolRate() const noexcept { return m_SymbolRate; }
uint8_t GetFECInner() const noexcept { return m_FECInner; }

protected:
bool StoreContents(const uint8_t *pPayload) override;

uint32_t m_Frequency; /**< frequency */
uint8_t m_FrameType; /**< frame_type */
uint8_t m_FECOuter; /**< FEC_outer */
uint8_t m_Modulation; /**< modulation */
uint32_t m_SymbolRate; /**< symbol_rate */
uint8_t m_FECInner; /**< FEC_inner */
};

/** サービス記述子クラス */
class ServiceDescriptor
: public DescriptorTemplate<ServiceDescriptor, 0x48>
Expand Down

0 comments on commit 6e794bc

Please sign in to comment.