📄 dsmcc-descriptor.c
字号:
#include <stdlib.h>#include <vdr/receiver.h>#include "dsmcc-descriptor.h"FILE *desc_fd;voidFreeDescriptor(struct descriptor *desc) { free(desc);}voidProcessDescriptorType(uchar *Data, struct descriptor *desc) { struct descriptor_type *type = &desc->data.type; type->text = (char *)malloc(desc->len); memcpy(type->text, Data, desc->len);}voidProcessDescriptorName(uchar *Data, struct descriptor *desc) { struct descriptor_name *name = &desc->data.name; name->text = (char *)malloc(desc->len); memcpy(name->text, Data, desc->len);}voidProcessDescriptorInfo(uchar *Data, struct descriptor *desc) { struct descriptor_info *info = &desc->data.info; memcpy(info->lang_code, Data, 3); info->text = (char *)malloc(desc->len - 3); memcpy(info->text, Data+3, desc->len - 3);}voidProcessDescriptorModlink(uchar *Data, struct descriptor *desc) { struct descriptor_modlink *modlink = &desc->data.modlink; modlink->position = Data[0];// fprintf(desc_fd, "Info -> Module -> Descriptor -> Modlink -> Position = %d\n", modlink->position); modlink->module_id = (Data[1] << 8) | Data[2];// fprintf(desc_fd, "Info -> Module -> Descriptor -> Modlink -> Mod Id = %d\n", modlink->module_id);}voidProcessDescriptorCrc32(uchar *Data, struct descriptor *desc) { struct descriptor_crc32 *crc32 = &desc->data.crc32; crc32->crc = (Data[0] << 24) | (Data[1] << 16) | (Data[2] << 8) | Data[3];// fprintf(desc_fd, "Info -> Module -> Descriptor -> CRC32 -> CRC = %ld\n", crc32->crc);}voidProcessDescriptorLocation(uchar *Data, struct descriptor *desc) { struct descriptor_location *location = &desc->data.location; location = new descriptor_location; location->location_tag = Data[0];// fprintf(desc_fd, "Info -> Module -> Descriptor -> Location -> Tag = %d\n", location->location_tag);}voidProcessDescriptorDltime(uchar *Data, struct descriptor *desc) { struct descriptor_dltime *dltime = &desc->data.dltime; dltime->download_time = (Data[0] << 24) | (Data[1] << 16) | (Data[2] << 8 ) | Data[3];// fprintf(desc_fd, "Info -> Module -> Descriptor -> Download -> Time = %ld\n", dltime->download_time);}voidProcessDescriptorGrouplink(uchar *Data, struct descriptor *desc) { struct descriptor_grouplink *grouplink = &desc->data.grouplink; grouplink->position = Data[0];// fprintf(desc_fd, "Info -> Module -> Descriptor -> Grouplink -> Position = %d\n", grouplink->position); grouplink->group_id = (Data[1] << 24) | (Data[2] << 16) | (Data[3] << 8 ) | Data[4];// fprintf(desc_fd, "Info -> Module -> Descriptor -> Grouplink -> Group Id = %ld\n", grouplink->group_id);}voidProcessDescriptorCompressed(uchar *Data, struct descriptor *desc) { struct descriptor_compressed *compressed = &desc->data.compressed; compressed->method = Data[0];// fprintf(desc_fd, "Info -> Module -> Descriptor -> Compressed -> Method = %d\n", compressed->method); compressed->original_size = (Data[1] << 24) | (Data[2] << 16) | (Data[3] << 8) | Data[4];// fprintf(desc_fd, "Info -> Module -> Descriptor -> Compressed -> Size = %ld\n", compressed->original_size);}/*struct descriptor_private *ProcessDescriptorPrivate(uchar *Data, struct descriptor *desc) { struct descriptor_private *private = &desc->data.private; private = new descriptor_private; private->descriptor = (char *)malloc(desc->len); memcpy(private->descriptor, Data, desc->len); return private;}*/struct descriptor *ProcessDescriptor(uchar *Data, int *offset) { struct descriptor *desc; int off=0; desc = new descriptor; desc->tag = Data[0]; desc->len = Data[1];/* fprintf(desc_fd, "Info -> Module -> Descriptor -> Tag = %d\n", desc->tag); fprintf(desc_fd, "Info -> Module -> Descriptor -> Length = %d\n", desc->len); fflush(desc_fd);*/ off += 2; switch(desc->tag) { case 0x01: ProcessDescriptorType(Data+2, desc); break; case 0x02: ProcessDescriptorName(Data+2, desc); break; case 0x03: ProcessDescriptorInfo(Data+2, desc); break; case 0x04: ProcessDescriptorModlink(Data+2, desc); break; case 0x05: ProcessDescriptorCrc32(Data+2, desc); break; case 0x06: ProcessDescriptorLocation(Data+2, desc); break; case 0x07: ProcessDescriptorDltime(Data+2, desc); break; case 0x08: ProcessDescriptorGrouplink(Data+2, desc); break; case 0x09: ProcessDescriptorCompressed(Data+2, desc); break; /* case 0x0A: Subgroup Association */ default: break;/* if(desc->tag >= 0x80 && desc->tag <= 0xFF) ProcessDescriptorPrivate(Data+2, desc); } else if( MHP tag ) */ } off+= desc->len; *offset += off; return desc;}struct descriptor *ProcessDescriptors(uchar *Data, int data_len, int *offset){ int index = 0; struct descriptor *desc, *last; // desc_fd = fopen("/tmp/desc.debug", "a"); desc = last = NULL; while(data_len > index) {// fprintf(desc_fd, "Data_len %d Index %d\n", data_len, index); desc = ProcessDescriptor(Data+index, &index); if(last == NULL) { last = desc; } else { last->next = desc; last = desc; } } if(last) last->next = NULL; *offset += index;// fclose(desc_fd); return desc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -