Changeset 11450
- Timestamp:
- 01/09/19 19:50:46 (5 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r11448 r11450 38 38 #endif 39 39 40 const char *streamtxt_00_to_1B[] = { 41 "Reserved", // 00 42 "Videostream (MPEG-1)", // 01 43 "Videostream (MPEG-2)", // 02 44 "Audiostream (MPEG-1)", // 03 45 "Audiostream (MPEG-2)", // 04 46 "Datastream (MPEG-2 tabled data)", // 05 47 "Data-/Audiostream (Subtitles/VBI and AC-3)", // 06 48 "Datastream (MHEG)", // 07 49 "Datastream (DSM CC)", // 08 50 "Conditional Access ", // 09 51 "Datastream (DSM CC)", // 0A 52 "Datastream (DSM CC)", // 0B 53 "Datastream (DSM CC)", // 0C 54 "Datastream (DSM CC)", // 0D 55 "Datastream (Auxiliary)", // 0E 56 "Audiostream (MPEG-2)", // 0F 57 "Videostream (MPEG-4 H.263)", // 10 58 "Audiostream (MPEG-4)", // 11 59 "Datastream (MPEG-4 FlexMux)", // 12 60 "Datastream (MPEG-4 FlexMux)", // 13 61 "Datastream (DSM CC)", // 14 62 "Datastream (Metadata)", // 15 63 "Datastream (Metadata)", // 16 64 "Datastream (DSM CC)", // 17 65 "Datastream (DSM CC)", // 18 66 "Datastream (Metadata)", // 19 67 "Datastream (IPMP)", // 1A 68 "Videostream (MPEG-4)", // 1B 69 }; 70 71 const char *streamtxt_80_to_87[] = { 72 "Video-/Audiostream (H.262/PCM)", // 80 73 "Audiostream (Dolby Digital)", // 81 74 "Data-/Audiostream (Subtitles/DTS6)", // 82 75 "Audiostream (Dolby TrueHD)", // 83 76 "Audiostream (Dolby Digital Plus)", // 84 77 "Audiostream (DTS 8)", // 85 78 "Audiostream (DTS 8 losless)", // 86 79 "Audiostream (Dolby Digital Plus)", // 87 80 }; 81 82 const char *get_streamtxt(uint8_t id) 83 { 84 if(id <= 0x1B) 85 { 86 return streamtxt_00_to_1B[id]; 87 } 88 else if(id == 0x24) 89 { 90 return "Videostream (H.265 Ultra HD video)"; 91 } 92 else if(id == 0x42) 93 { 94 return "Videostream (Chinese Video Standard)"; 95 } 96 else if(id >= 0x80 && id <= 0x87) 97 { 98 return streamtxt_80_to_87[id - 0x80]; 99 } 100 else if(id == 0x90) 101 { 102 return "Datastream (Blu-ray subtitling)"; 103 } 104 else if(id == 0x95) 105 { 106 return "Datastream (DSM CC)"; 107 } 108 else if(id == 0xC0) 109 { 110 return "Datastream (DigiCipher II text)"; 111 } 112 else if(id == 0xC2) 113 { 114 return "Datastream (DSM CC)"; 115 } 116 else if(id == 0xD1) 117 { 118 return "Videostream (BBC Dirac Ultra HD video)"; 119 } 120 else if(id == 0xEA) 121 { 122 return "Videostream (WMV9 lower bit-rate)"; 123 } 124 else 125 { 126 return "Reserved"; 127 } 128 } 129 40 const char* get_stream_type_txt(uint8_t stream_type) 41 { 42 switch(stream_type) 43 { 44 case 0x00: return "invalid"; 45 case 0x01: return "MPEG-1 video"; 46 case 0x02: return "MPEG-2 video"; // MPEG-1 (constrained parameter) or MPEG-2 video 47 case 0x03: return "MPEG-1 audio"; // MP1, MP2, MP3 48 case 0x04: return "MPEG-2 audio"; // MP1, MP2, MP3 49 case 0x05: return "MPEG-2 private sections"; 50 case 0x06: return "MPEG-2 PES private data"; // AC-3, Enhanced AC-3, AC-4, DTS(-HD) audio, subtitles, etc (DVB) (depends on descriptor) 51 case 0x07: return "MHEG data"; 52 case 0x08: return "DSM-CC data"; 53 case 0x09: return "MPEG-2 over ATM data"; 54 case 0x0A: return "DSM-CC data"; 55 case 0x0B: return "DSM-CC data"; 56 case 0x0C: return "DSM-CC data"; 57 case 0x0D: return "DSM-CC data"; 58 case 0x0E: return "MPEG-2 auxiliary data"; 59 case 0x0F: return "MPEG-2 audio"; // AAC 60 case 0x10: return "MPEG-4 video"; 61 case 0x11: return "MPEG-4 audio"; // AAC, HE AAC and AAC v2 62 case 0x12: return "MPEG-4 PES data"; 63 case 0x13: return "MPEG-4 data"; 64 case 0x14: return "DSM-CC data"; 65 case 0x15: return "MPEG-7 MetaData"; 66 case 0x16: return "MPEG-7 MetaData"; 67 case 0x17: return "MPEG-7 MetaData"; 68 case 0x18: return "MPEG-7 MetaData"; 69 case 0x19: return "MPEG-7 MetaData"; 70 case 0x1A: return "MPEG-2 IPMP data"; 71 case 0x1B: return "AVC video"; 72 case 0x1C: return "MPEG-4 audio"; // DST, ALS, SLS 73 case 0x24: return "HEVC video"; 74 case 0x25: return "HEVC subset video"; 75 case 0x2D: return "MPEG-H 3D audio"; // main stream 76 case 0x2E: return "MPEG-H 3D audio"; // auxiliary stream 77 case 0x42: return "Chinese video"; 78 case 0x7F: return "IPMP data"; 79 case 0x81: return "AC-3 audio (ATSC)"; // with descriptor tag 0x81 80 case 0x86: return "SCTE 35 data"; 81 case 0x87: return "enhanced AC-3 audio (ATSC)"; 82 //case 0x88: return "DTS-HD audio (ATSC 2.0)"; // fixme: has ATSC 2.0 ever been used? 83 //case 0x??: return "AC-4 audio (ATSC 3.0)"; // fixme: add the actual value when it gets published 84 //case 0x??: return "MPEG-H 3D audio (ATSC 3.0)"; // fixme: add the actual value when it gets published 85 case 0xD1: return "BBC Dirac video"; 86 case 0xEA: return "VC-1 video"; 87 88 default: return "user private"; 89 } 90 } 91 92 const char *get_descriptor_tag_txt(uint8_t descriptor_tag) 93 { 94 switch(descriptor_tag) 95 { 96 // Valid in all MPEG contexts: 97 case 0x00: return "reserved"; 98 case 0x01: return "forbidden"; 99 case 0x02: return "video stream"; 100 case 0x03: return "audio stream"; 101 case 0x04: return "hierarchy"; 102 case 0x05: return "registration"; 103 case 0x06: return "data stream alignment"; 104 case 0x07: return "target background grid"; 105 case 0x08: return "video window"; 106 case 0x09: return "CA"; 107 case 0x0A: return "ISO 639 language"; 108 case 0x0B: return "system clock"; 109 case 0x0C: return "multiplex buffer utilization"; 110 case 0x0D: return "copyright"; 111 case 0x0E: return "maximum bitrate"; 112 case 0x0F: return "private data indicator"; 113 case 0x10: return "smoothing buffer"; 114 case 0x11: return "STD"; 115 case 0x12: return "IBP"; 116 case 0x13: return "DSM-CC carousel identifier"; 117 case 0x14: return "DSM-CC association tag"; 118 case 0x15: return "DSM-CC deferred association tags"; 119 case 0x17: return "DSM-CC NPT reference"; 120 case 0x18: return "DSM-CC NPT endpoint"; 121 case 0x19: return "DSM-CC stream mode"; 122 case 0x1A: return "DSM-CC stream event"; 123 case 0x1B: return "MPEG-4 video"; 124 case 0x1C: return "MPEG-4 audio"; 125 case 0x1D: return "IOD"; 126 case 0x1E: return "SL"; 127 case 0x1F: return "FMC"; 128 case 0x20: return "External ES id"; 129 case 0x21: return "MuxCode"; 130 case 0x22: return "FmxBufferSize"; 131 case 0x23: return "MultiplexBuffer"; 132 case 0x24: return "Content labeling"; 133 case 0x25: return "Metadata association"; 134 case 0x26: return "Metadata"; 135 case 0x27: return "Metadata STD"; 136 case 0x28: return "AVC video"; 137 case 0x29: return "MPEG-2 IPMP"; 138 case 0x2A: return "AVC timing and HRD"; 139 case 0x2B: return "MPEG-2 AAC Audio"; 140 case 0x2C: return "FlexMuxTiming"; 141 case 0x2D: return "MPEG-4 Text"; 142 case 0x2E: return "MPEG-4 Audio Extension"; 143 case 0x2F: return "Auxiliary Video Stream"; 144 case 0x30: return "SVC Extension"; 145 case 0x31: return "MVC Extension"; 146 case 0x32: return "J2K Video"; 147 case 0x33: return "MVC Operation Point"; 148 case 0x34: return "MPEG-2 Stereoscopic Video Format"; 149 case 0x35: return "Stereoscopic Program Info"; 150 case 0x36: return "Stereoscopic Video Info"; 151 case 0x37: return "Transport Profile"; 152 case 0x38: return "HEVC Video"; 153 case 0x3F: return "MPEG-2 Extension"; 154 155 // Valid in DVB context: 156 case 0x45: return "VBI data"; 157 case 0x46: return "VBI teletext"; 158 case 0x51: return "mosaic"; 159 case 0x52: return "stream identifier"; 160 case 0x56: return "teletext"; 161 case 0x59: return "subtitling"; // with stream type 0x06 162 case 0x5F: return "private data specifier"; 163 case 0x60: return "service move"; 164 case 0x65: return "scrambling"; 165 case 0x66: return "data broadcast id"; 166 case 0x6A: return "AC-3"; // with stream type 0x06 167 case 0x6B: return "ancillary data"; 168 case 0x6F: return "application signalling"; 169 case 0x70: return "adaptation field data"; 170 case 0x74: return "related content"; 171 case 0x78: return "ECM repetition rate"; 172 case 0x7A: return "enhanced AC-3"; // with stream type 0x06 173 case 0x7B: return "DTS"; // with stream type 0x06 174 case 0x7C: return "AAC"; // with stream type 0x06 175 case 0x7D: return "XAIT location"; 176 case 0x7F: return "DVB extension"; 177 178 default: return "user private"; 179 } 180 } 181 182 const char *get_extension_descriptor_txt(uint8_t extension_tag) 183 { 184 switch(extension_tag) 185 { 186 case 0x02: return "CP"; 187 case 0x06: return "supplementary audio"; 188 case 0x0E: return "DTS-HD"; // with stream type 0x06 189 case 0x0F: return "DTS Neural"; // with stream type 0x06 190 case 0x11: return "T2MI"; 191 case 0x13: return "URI linkage"; 192 case 0x15: return "AC-4"; // with stream type 0x06 193 case 0x18: return "protection message"; 194 case 0x19: return "audio preselection"; 195 case 0x20: return "TTML subtitling"; // (could become 0x1A, value in A038 draft seems weird) 196 197 default: return "Undefined"; 198 } 199 } 130 200 131 201 void flush_read_fd(int32_t demux_index, int32_t num, int fd) … … 2901 2971 } 2902 2972 2903 void dvbapi_parse_descriptor (int32_t demux_id, uint32_t info_length, unsigned char *buffer, uint8_t* is_audio)2973 void dvbapi_parse_descriptors(int32_t demux_id, uint32_t info_length, unsigned char *buffer, uint8_t *type) 2904 2974 { 2905 2975 // int32_t ca_pmt_cmd_id = buffer[i + 5]; 2906 uint32_t descriptor_length = 0; 2976 uint8_t descriptor_tag = buffer[0], descriptor_length = 0; 2977 uint8_t skip_border = cfg.dvbapi_boxtype == BOXTYPE_SAMYGO ? 0x05 : 0x02; // skip input values <0x05 on samygo 2907 2978 uint32_t j, u, k; 2908 uint8_t skip_border = cfg.dvbapi_boxtype == BOXTYPE_SAMYGO ? 0x05 : 0x02; // skip input values <0x05 on samygo 2909 2910 static const char format_identifiers_audio[10][5] = 2911 { 2912 "AC-3", "BSSD", "dmat", "DTS1", "DTS2", 2913 "DTS3", "EAC3", "HDMV", "mlpa", "Opus", 2914 }; 2979 2980 static const char format_identifiers_audio[11][5] = 2981 { 2982 // "HDMV" format identifier is removed 2983 // OSCam does not need to know about Blu-ray 2984 "AC-3", "BSSD", "dmat", "DRA1", "DTS1", 2985 "DTS2", "DTS3", "EAC3", "mlpa", "Opus", 2986 }; 2915 2987 2916 2988 if(info_length < 1) 2917 2989 { return; } 2918 2990 2919 if((buffer[0] < skip_border) && info_length > 0) // skip input values like 0x00 and 0x01 2991 // skip descriptors with tag 0x00 and 0x01, 2992 // or even greater for samygo (not sure why we do this...) 2993 if((descriptor_tag < skip_border) && info_length > 0) 2920 2994 { 2921 2995 buffer++; … … 2925 2999 for(j = 0; j + 1 < info_length; j += descriptor_length + 2) 2926 3000 { 3001 descriptor_tag = buffer[j]; 2927 3002 descriptor_length = buffer[j + 1]; 2928 2929 if(is_audio) 2930 { 2931 if(buffer[j] == 0x6A || buffer[j] == 0x73 || buffer[j] == 0x81) 2932 { 2933 *is_audio = 1; 2934 } 2935 else if(buffer[j] == 0x05 && descriptor_length >= 4) 3003 cs_log_dbg(D_DVBAPI, "Demuxer %d found %s descriptor (tag: %02X length: %02X)", demux_id, 3004 get_descriptor_tag_txt(descriptor_tag), descriptor_tag, descriptor_length); 3005 3006 switch(descriptor_tag) 3007 { 3008 case 0x05: // registration descriptor 2936 3009 { 2937 3010 for(k = 0; k < 10; k++) … … 2939 3012 if(memcmp(buffer + j + 2, format_identifiers_audio[k], 4) == 0) 2940 3013 { 2941 * is_audio = 1;3014 *type = STREAM_AUDIO; 2942 3015 break; 2943 3016 } 2944 3017 } 2945 } 2946 } 2947 2948 if(buffer[j] == 0x81 && descriptor_length == 8) // private descriptor of length 8, assume enigma/tvh 2949 { 2950 demux[demux_id].enigma_namespace = b2i(4, buffer + j + 2); 2951 demux[demux_id].tsid = b2i(2, buffer + j + 6); 2952 demux[demux_id].onid = b2i(2, buffer + j + 8); 2953 cs_log_dbg(D_DVBAPI, "Demuxer %d found pmt type: %02x length: %d (assuming enigma private descriptor: namespace %04x tsid %02x onid %02x)", demux_id, 2954 buffer[j], descriptor_length, demux[demux_id].enigma_namespace, demux[demux_id].tsid, demux[demux_id].onid); 2955 } 2956 else if (descriptor_length !=0) 2957 { 2958 cs_log_dbg(D_TRACE, "Demuxer %d found pmt type: %02x length: %d", demux_id, buffer[j], descriptor_length); 2959 } 2960 2961 if(buffer[j] != 0x09) { continue; } 2962 2963 int32_t descriptor_ca_system_id = b2i(2, buffer + j + 2); 2964 int32_t descriptor_ca_pid = b2i(2, buffer + j + 4)&0x1FFF; 2965 int32_t descriptor_ca_provider = 0; 2966 uint32_t descriptor_ca_data = 0; 2967 char txt[40]; // room for PBM: 8 byte pbm and DATE: date 2968 memset(txt, 0x00, sizeof(txt)); 2969 2970 if(descriptor_ca_system_id >> 8 == 0x01) 2971 { 2972 for(u = 2; u < descriptor_length; u += 15) 2973 { 2974 descriptor_ca_pid = b2i(2, buffer + j + u + 2)&0x1FFF; 2975 descriptor_ca_provider = b2i(2, buffer + j + u + 4); 2976 int8_t year = buffer[j + u + 15] >> 1; 2977 int8_t month = (((buffer[j + u + 15]&0x01) << 3) | (buffer[j + u + 16] >> 5)); 2978 int8_t day = buffer[j + u + 16]&0x1F; 2979 snprintf(txt, sizeof(txt), "PBM: "); 2980 cs_hexdump(0, buffer + j + u + 7, 8, txt+5, (2*8)+1); // hexdump 8 byte pbm 2981 snprintf(txt+20, sizeof(txt)-20, " DATE: %d-%d-%d", day, month, year+1990); 2982 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, 0, txt); 2983 } 2984 } 2985 else 2986 { 2987 if(caid_is_viaccess(descriptor_ca_system_id) && descriptor_length == 0x0F && buffer[j + 12] == 0x14) 2988 { descriptor_ca_provider = b2i(3, buffer + j + 14) &0xFFFFF0; } 2989 2990 else if(caid_is_nagra(descriptor_ca_system_id) && descriptor_length == 0x07) 2991 { descriptor_ca_provider = b2i(2, buffer + j + 7); } 2992 2993 else if((descriptor_ca_system_id >> 8 == 0x4A || descriptor_ca_system_id == 0x2710) && descriptor_length > 0x04 ) 2994 { 2995 descriptor_ca_provider = buffer[j + 6]; 2996 2997 if(caid_is_dre(descriptor_ca_system_id) && descriptor_length == 0xA) 2998 { 2999 descriptor_ca_data = (buffer[j+8] << 24) | (buffer[j+9] << 16) | (buffer[j+10] << 8) | buffer[j+11]; 3000 snprintf(txt, 40, "CA DATA: %X", descriptor_ca_data); 3001 } 3002 } 3003 3004 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, descriptor_ca_data, txt); 3005 3018 break; 3019 } 3020 3021 case 0x09: // CA descriptor 3022 { 3023 int32_t descriptor_ca_system_id = b2i(2, buffer + j + 2); 3024 int32_t descriptor_ca_pid = b2i(2, buffer + j + 4)&0x1FFF; 3025 int32_t descriptor_ca_provider = 0; 3026 uint32_t descriptor_ca_data = 0; 3027 char txt[40]; // room for PBM: 8 byte pbm and DATE: date 3028 memset(txt, 0x00, sizeof(txt)); 3029 3030 if(descriptor_ca_system_id >> 8 == 0x01) 3031 { 3032 for(u = 2; u < descriptor_length; u += 15) 3033 { 3034 descriptor_ca_pid = b2i(2, buffer + j + u + 2)&0x1FFF; 3035 descriptor_ca_provider = b2i(2, buffer + j + u + 4); 3036 int8_t year = buffer[j + u + 15] >> 1; 3037 int8_t month = (((buffer[j + u + 15]&0x01) << 3) | (buffer[j + u + 16] >> 5)); 3038 int8_t day = buffer[j + u + 16]&0x1F; 3039 snprintf(txt, sizeof(txt), "PBM: "); 3040 cs_hexdump(0, buffer + j + u + 7, 8, txt+5, (2*8)+1); // hexdump 8 byte pbm 3041 snprintf(txt+20, sizeof(txt)-20, " DATE: %d-%d-%d", day, month, year+1990); 3042 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, 0, txt); 3043 } 3044 } 3045 else 3046 { 3047 if(caid_is_viaccess(descriptor_ca_system_id) && descriptor_length == 0x0F && buffer[j + 12] == 0x14) 3048 { descriptor_ca_provider = b2i(3, buffer + j + 14) &0xFFFFF0; } 3049 3050 else if(caid_is_nagra(descriptor_ca_system_id) && descriptor_length == 0x07) 3051 { descriptor_ca_provider = b2i(2, buffer + j + 7); } 3052 3053 else if((descriptor_ca_system_id >> 8 == 0x4A || descriptor_ca_system_id == 0x2710) && descriptor_length > 0x04 ) 3054 { 3055 descriptor_ca_provider = buffer[j + 6]; 3056 3057 if(caid_is_dre(descriptor_ca_system_id) && descriptor_length == 0xA) 3058 { 3059 descriptor_ca_data = (buffer[j+8] << 24) | (buffer[j+9] << 16) | (buffer[j+10] << 8) | buffer[j+11]; 3060 snprintf(txt, 40, "CA DATA: %X", descriptor_ca_data); 3061 } 3062 } 3063 3064 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, descriptor_ca_data, txt); 3065 } 3066 break; 3067 } 3068 3069 case 0x59: // subtitling descriptor (DVB) 3070 { 3071 *type = STREAM_SUBTITLE; 3072 break; 3073 } 3074 3075 case 0x6A: // AC-3 descriptor (DVB) 3076 case 0x7A: // enhanced AC-3 descriptor (DVB) 3077 case 0x7B: // DTS descriptor (DVB) 3078 case 0x7C: // AAC descriptor (DVB) 3079 { 3080 *type = STREAM_AUDIO; 3081 break; 3082 } 3083 3084 case 0x7F: // extension descriptor (DVB) 3085 { 3086 uint8_t extension_descriptor_tag = buffer[j + 2]; 3087 cs_log_dbg(D_DVBAPI, "Demuxer %d found %s descriptor (extension tag: %02X)", demux_id, 3088 get_extension_descriptor_txt(extension_descriptor_tag), extension_descriptor_tag); 3089 3090 switch(extension_descriptor_tag) 3091 { 3092 case 0x0E: // DTS-HD descriptor (DVB) 3093 case 0x0F: // DTS Neural descriptor (DVB) 3094 case 0x15: // AC-4 descriptor (DVB) 3095 *type = STREAM_AUDIO; 3096 break; 3097 3098 default: 3099 *type = STREAM_UNDEFINED; 3100 break; 3101 } 3102 break; 3103 } 3104 3105 case 0x81: 3106 { 3107 if(descriptor_length == 8) // private descriptor of length 8, assume enigma/tvh 3108 { 3109 demux[demux_id].enigma_namespace = b2i(4, buffer + j + 2); 3110 demux[demux_id].tsid = b2i(2, buffer + j + 6); 3111 demux[demux_id].onid = b2i(2, buffer + j + 8); 3112 cs_log_dbg(D_DVBAPI, "Demuxer %d assuming enigma private descriptor (namespace: %08X tsid: %04X onid: %04X)", 3113 demux_id, demux[demux_id].enigma_namespace, demux[demux_id].tsid, demux[demux_id].onid); 3114 } 3115 else if(descriptor_length != 0) // AC-3 descriptor (ATSC) 3116 { 3117 *type = STREAM_AUDIO; 3118 cs_log_dbg(D_DVBAPI, "Demuxer %d assuming AC-3 descriptor (ATSC)", demux_id); 3119 } 3120 break; 3121 } 3122 3123 case 0x82: 3124 { 3125 if(descriptor_length == 2) // private descriptor of length 2, assume enigma/tvh 3126 { 3127 // we have already parsed this descriptor in getDemuxOptions() 3128 cs_log_dbg(D_DVBAPI, "Demuxer %d assuming enigma private descriptor", demux_id); 3129 } 3130 break; 3131 } 3132 3133 case 0x83: 3134 { 3135 if(descriptor_length == 1) // private descriptor of length 2, assume enigma/tvh 3136 { 3137 // we have already parsed this descriptor in getDemuxOptions() 3138 cs_log_dbg(D_DVBAPI, "Demuxer %d assuming enigma private descriptor", demux_id); 3139 } 3140 break; 3141 } 3142 3143 case 0x84: 3144 { 3145 if(descriptor_length == 2) // private descriptor of length 2, assume enigma/tvh 3146 { 3147 // we have already parsed this descriptor in getDemuxOptions() 3148 cs_log_dbg(D_DVBAPI, "Demuxer %d assuming enigma private descriptor", demux_id); 3149 } 3150 break; 3151 } 3152 3153 case 0x85: 3154 { 3155 if(descriptor_length == 4) // private descriptor of length 4, assume enigma/tvh 3156 { 3157 // descriptor is not used by OSCam 3158 cs_log_dbg(D_DVBAPI, "Demuxer %d assuming enigma private descriptor", demux_id); 3159 } 3160 break; 3161 } 3162 3163 default: 3164 break; 3006 3165 } 3007 3166 } … … 3348 3507 demux[demux_id].STREAMpidcount = 0; // reset number of streams 3349 3508 3350 if(program_info_length > 1 && program_info_length < length) 3351 { 3352 dvbapi_parse_descriptor (demux_id, program_info_length, buffer + program_info_start, NULL);3509 if(program_info_length > 1 && program_info_length < length) // parse program descriptors 3510 { 3511 dvbapi_parse_descriptors(demux_id, program_info_length, buffer + program_info_start, NULL); 3353 3512 } 3354 3513 … … 3358 3517 for(i = program_info_length + program_info_start; i + 4 < length; i += es_info_length + 5) 3359 3518 { 3360 uint8_t stream_type = buffer[i] ;3519 uint8_t stream_type = buffer[i], type = STREAM_UNDEFINED; 3361 3520 uint16_t elementary_pid = b2i(2, buffer + i + 1)&0x1FFF; 3362 uint8_t is_audio = 0;3363 3521 es_info_length = b2i(2, buffer + i +3)&0x0FFF; 3364 3522 3365 3523 if(demux[demux_id].STREAMpidcount < ECM_PIDS) 3366 3524 { 3367 3368 demux[demux_id].STREAMpids[demux[demux_id].STREAMpidcount] = elementary_pid; 3369 demux[demux_id].STREAMpidsType[demux[demux_id].STREAMpidcount] = buffer[i]; 3370 demux[demux_id].STREAMpidcount++; 3371 3372 cs_log_dbg(D_DVBAPI,"Demuxer %d stream %s(type: %02x pid: %04x length: %d)", demux_id, get_streamtxt(stream_type), stream_type, elementary_pid, 3373 es_info_length); 3374 3375 // find and register videopid 3376 if(!vpid && 3377 (stream_type == 0x01 || stream_type == 0x02 || stream_type == 0x10 || stream_type == 0x1B 3378 || stream_type == 0x24 || stream_type == 0x42 || stream_type == 0xD1 || stream_type == 0xEA)) 3379 { 3380 vpid = elementary_pid; 3381 } 3382 3383 if(es_info_length != 0 && es_info_length < length) 3384 { 3385 dvbapi_parse_descriptor(demux_id, es_info_length, buffer + i + 5, &is_audio); 3386 3387 if((stream_type == 0x06 || stream_type == 0x80 || stream_type == 0x82) && is_audio) 3388 { 3389 demux[demux_id].STREAMpidsType[demux[demux_id].STREAMpidcount-1] = 0x03; 3390 stream_type = 0x03; 3391 } 3392 else if(!vpid && stream_type == 0x80 && !is_audio) 3393 { 3394 vpid = elementary_pid; 3395 } 3525 cs_log_dbg(D_DVBAPI,"Demuxer %d found %s stream (type: %02X pid: %04X)", 3526 demux_id, get_stream_type_txt(stream_type), stream_type, elementary_pid); 3527 3528 if(es_info_length != 0 && es_info_length < length) // parse program element descriptors 3529 { 3530 dvbapi_parse_descriptors(demux_id, es_info_length, buffer + i + 5, &type); 3396 3531 } 3397 3532 else … … 3410 3545 } 3411 3546 } 3547 3548 switch(stream_type) 3549 { 3550 case 0x01: 3551 case 0x02: 3552 case 0x10: 3553 case 0x1B: 3554 case 0x20: 3555 case 0x24: 3556 case 0x25: 3557 case 0x42: 3558 case 0xD1: 3559 case 0xEA: 3560 if(!vpid) 3561 { 3562 vpid = elementary_pid; // register videopid 3563 } 3564 demux[demux_id].STREAMpidsType[demux[demux_id].STREAMpidcount] = STREAM_VIDEO; 3565 break; 3566 3567 case 0x03: 3568 case 0x04: 3569 case 0x0F: 3570 case 0x11: 3571 case 0x1C: 3572 case 0x2D: 3573 case 0x2E: 3574 demux[demux_id].STREAMpidsType[demux[demux_id].STREAMpidcount] = STREAM_AUDIO; 3575 break; 3576 3577 case 0x06: 3578 case 0x81: 3579 case 0x87: 3580 // Set the type based on the descriptors for these streams 3581 demux[demux_id].STREAMpidsType[demux[demux_id].STREAMpidcount] = type; 3582 break; 3583 3584 default: 3585 demux[demux_id].STREAMpidsType[demux[demux_id].STREAMpidcount] = STREAM_UNDEFINED; 3586 break; 3587 } 3588 3589 demux[demux_id].STREAMpids[demux[demux_id].STREAMpidcount] = elementary_pid; 3590 demux[demux_id].STREAMpidcount++; 3412 3591 } 3413 3592 } … … 6255 6434 { 6256 6435 int32_t key_pos_a = 0; 6257 uint8_t *cw , stream_type;6436 uint8_t *cw; 6258 6437 6259 6438 demux[i].ECMpids[j].useMultipleIndices = 1; … … 6261 6440 for(k = 0; k < demux[i].STREAMpidcount; k++) 6262 6441 { 6263 stream_type = demux[i].STREAMpidsType[k]; 6264 6265 // Video 6266 if(stream_type == 0x01 || stream_type == 0x02 || stream_type == 0x10 || stream_type == 0x1B 6267 || stream_type == 0x24 || stream_type == 0x42 || stream_type == 0x80 || stream_type == 0xD1 6268 || stream_type == 0xEA) 6442 if(demux[i].STREAMpidsType[k] == STREAM_VIDEO) 6269 6443 { 6270 6444 cw = er->cw; 6271 6445 } 6272 // Audio 6273 else if(stream_type == 0x03 || stream_type == 0x04 || stream_type == 0x06 || stream_type == 0x0F 6274 || stream_type == 0x11 || stream_type == 0x81 || (stream_type >= 0x83 && stream_type <= 0x87) 6275 || stream_type == 0x8A) 6446 else if(demux[i].STREAMpidsType[k] == STREAM_AUDIO) 6276 6447 { 6277 6448 cw = er->cw_ex.audio[key_pos_a]; 6278 6279 6449 if(key_pos_a < 3) 6280 6450 { … … 6282 6452 } 6283 6453 } 6284 // Data 6285 else 6454 else // Data 6286 6455 { 6287 6456 cw = er->cw_ex.data; 6457 break; 6288 6458 } 6289 6459 -
trunk/module-dvbapi.h
r11388 r11450 117 117 int8_t api; 118 118 }; 119 120 #define STREAM_UNDEFINED 0x00 121 #define STREAM_VIDEO 0x01 122 #define STREAM_AUDIO 0x02 123 #define STREAM_SUBTITLE 0x03 119 124 120 125 struct s_ecmpids
Note:
See TracChangeset
for help on using the changeset viewer.