femon-2.2.1/0000755000000000000000000000000012507745733011333 5ustar rootrootfemon-2.2.1/h264.c0000644000000000000000000007461612507636100012163 0ustar rootroot/* * h264.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "log.h" #include "tools.h" #include "h264.h" const cFemonH264::t_DAR cFemonH264::darS[] = { { VIDEO_ASPECT_RATIO_1_1, 100 }, { VIDEO_ASPECT_RATIO_4_3, 133 }, { VIDEO_ASPECT_RATIO_16_9, 177 }, { VIDEO_ASPECT_RATIO_2_21_1, 221 }, { VIDEO_ASPECT_RATIO_12_11, 109 }, { VIDEO_ASPECT_RATIO_10_11, 90 }, { VIDEO_ASPECT_RATIO_16_11, 145 }, { VIDEO_ASPECT_RATIO_40_33, 121 }, { VIDEO_ASPECT_RATIO_24_11, 218 }, { VIDEO_ASPECT_RATIO_20_11, 181 }, { VIDEO_ASPECT_RATIO_32_11, 290 }, { VIDEO_ASPECT_RATIO_80_33, 242 }, { VIDEO_ASPECT_RATIO_18_11, 163 }, { VIDEO_ASPECT_RATIO_15_11, 136 }, { VIDEO_ASPECT_RATIO_64_33, 193 }, { VIDEO_ASPECT_RATIO_160_99, 161 }, { VIDEO_ASPECT_RATIO_3_2, 150 }, { VIDEO_ASPECT_RATIO_2_1, 200 } }; const cFemonH264::t_SAR cFemonH264::sarS[] = { { 0, 0 }, // VIDEO_ASPECT_RATIO_INVALID { 1, 1 }, // VIDEO_ASPECT_RATIO_1_1 { 12, 11 }, // VIDEO_ASPECT_RATIO_12_11 { 10, 11 }, // VIDEO_ASPECT_RATIO_10_11 { 16, 11 }, // VIDEO_ASPECT_RATIO_16_11 { 40, 33 }, // VIDEO_ASPECT_RATIO_40_33 { 24, 11 }, // VIDEO_ASPECT_RATIO_24_11 { 20, 11 }, // VIDEO_ASPECT_RATIO_20_11 { 32, 11 }, // VIDEO_ASPECT_RATIO_32_11 { 80, 33 }, // VIDEO_ASPECT_RATIO_80_33 { 18, 11 }, // VIDEO_ASPECT_RATIO_18_11 { 15, 11 }, // VIDEO_ASPECT_RATIO_15_11 { 64, 33 }, // VIDEO_ASPECT_RATIO_64_33 { 160, 99 }, // VIDEO_ASPECT_RATIO_160_99 { 4, 3 }, // VIDEO_ASPECT_RATIO_4_3 { 3, 2 }, // VIDEO_ASPECT_RATIO_3_2 { 2, 1 } // VIDEO_ASPECT_RATIO_2_1 }; const eVideoFormat cFemonH264::videoFormatS[] = { VIDEO_FORMAT_COMPONENT, VIDEO_FORMAT_PAL, VIDEO_FORMAT_NTSC, VIDEO_FORMAT_SECAM, VIDEO_FORMAT_MAC, VIDEO_FORMAT_UNKNOWN, VIDEO_FORMAT_RESERVED }; const uint8_t cFemonH264::seiNumClockTsTableS[9] = { 1, 1, 1, 2, 2, 3, 3, 2, 3 }; cFemonH264::cFemonH264(cFemonVideoIf *videoHandlerP) : videoHandlerM(videoHandlerP), widthM(0), heightM(0), aspectRatioM(VIDEO_ASPECT_RATIO_INVALID), formatM(VIDEO_FORMAT_INVALID), frameRateM(0), bitRateM(0), scanM(VIDEO_SCAN_INVALID), cpbDpbDelaysPresentFlagM(false), picStructPresentFlagM(false), frameMbsOnlyFlagM(false), mbAdaptiveFrameFieldFlagM(false), timeOffsetLengthM(0) { reset(); } cFemonH264::~cFemonH264() { } bool cFemonH264::processVideo(const uint8_t *bufP, int lenP) { uint8_t nal_data[lenP]; bool aud_found = false, sps_found = false, sei_found = true; // SEI temporarily disabled! const uint8_t *buf = bufP; const uint8_t *start = buf; const uint8_t *end = start + lenP; if (!videoHandlerM) return false; // skip PES header if (!PesLongEnough(lenP)) return false; buf += PesPayloadOffset(buf); start = buf; reset(); for (;;) { int consumed = 0; buf = nextStartCode(buf, end); if (buf >= end) break; switch (buf[3] & 0x1F) { case NAL_AUD: if (!aud_found) { switch (buf[4] >> 5) { case 0: case 3: case 5: // I_FRAME debug2("%s Found NAL AUD at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP); aud_found = true; break; case 1: case 4: case 6: // P_FRAME; case 2: case 7: // B_FRAME; default: // NO_PICTURE; break; } } break; case NAL_SPS: if (!sps_found) { debug2("%s Found NAL SPS at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP); int nal_len = nalUnescape(nal_data, buf + 4, int(end - buf - 4)); consumed = parseSPS(nal_data, nal_len); if (consumed > 0) sps_found = true; } break; case NAL_SEI: if (!sei_found) { debug2("%s Found NAL SEI at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP); int nal_len = nalUnescape(nal_data, buf + 4, int(end - buf - 4)); consumed = parseSEI(nal_data, nal_len); if (consumed > 0) sei_found = true; } break; default: break; } if (aud_found && sps_found && sei_found) break; buf += consumed + 4; } if (aud_found) { videoHandlerM->SetVideoCodec(VIDEO_CODEC_H264); if (sps_found) { debug2("%s width=%d height=%d, aspect=%d format=%d bitrate=%.0f", __PRETTY_FUNCTION__, widthM, heightM, aspectRatioM, formatM, bitRateM); videoHandlerM->SetVideoFormat(formatM); videoHandlerM->SetVideoSize(widthM, heightM); videoHandlerM->SetVideoAspectRatio(aspectRatioM); videoHandlerM->SetVideoBitrate(bitRateM); } if (sps_found || sei_found) { debug2("%s scan=%d framerate=%.2f", __PRETTY_FUNCTION__, scanM, (scanM == VIDEO_SCAN_PROGRESSIVE) ? (frameRateM / 2) : frameRateM); videoHandlerM->SetVideoScan(scanM); videoHandlerM->SetVideoFramerate((scanM == VIDEO_SCAN_PROGRESSIVE) ? (frameRateM / 2) : frameRateM); } } return aud_found; } void cFemonH264::reset() { cpbDpbDelaysPresentFlagM = false; picStructPresentFlagM = false; frameMbsOnlyFlagM = false; mbAdaptiveFrameFieldFlagM = false; timeOffsetLengthM = 0; } const uint8_t *cFemonH264::nextStartCode(const uint8_t *startP, const uint8_t *endP) { for (endP -= 3; startP < endP; ++startP) { if ((startP[0] == 0x00) && (startP[1] == 0x00) && (startP[2] == 0x01)) return startP; } return (endP + 3); } int cFemonH264::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP) { int s = 0, d = 0; while (s < lenP) { if (!srcP[s] && !srcP[s + 1]) { // hit 00 00 xx dstP[d] = dstP[d + 1] = 0; s += 2; d += 2; if (srcP[s] == 3) { s++; // 00 00 03 xx --> 00 00 xx if (s >= lenP) return d; } } dstP[d++] = srcP[s++]; } return d; } int cFemonH264::parseSPS(const uint8_t *bufP, int lenP) { int profile_idc, level_idc, constraint_set3_flag, pic_order_cnt_type, i, j; cFemonBitStream bs(bufP, lenP); uint32_t width = widthM; uint32_t height = heightM; eVideoAspectRatio aspect_ratio = aspectRatioM; eVideoFormat format = formatM; double frame_rate = frameRateM; double bit_rate = bitRateM; bool cpb_dpb_delays_present_flag = cpbDpbDelaysPresentFlagM; bool pic_struct_present_flag = picStructPresentFlagM; bool frame_mbs_only_flag = frameMbsOnlyFlagM; bool mb_adaptive_frame_field_flag = mbAdaptiveFrameFieldFlagM; uint32_t time_offset_length = timeOffsetLengthM; profile_idc = bs.GetBits(8); // profile_idc bs.SkipBit(); // constraint_set0_flag bs.SkipBit(); // constraint_set1_flag bs.SkipBit(); // constraint_set2_flag constraint_set3_flag = bs.GetBit(); // constraint_set3_flag bs.SkipBits(4); // reserved_zero_4bits level_idc = bs.GetBits(8); // level_idc bs.SkipUeGolomb(); // seq_parameter_set_id debug2("%s profile_idc=%d level_idc=%d", __PRETTY_FUNCTION__, profile_idc, level_idc); switch (profile_idc) { case 66: // baseline profile case 77: // main profile case 88: // extended profile switch (level_idc) { case 10: // level 1.0 bit_rate = 64000; break; case 11: // level 1b / 1.1 bit_rate = constraint_set3_flag ? 128000 : 192000; break; case 12: // level 1.2 bit_rate = 384000; break; case 13: // level 1.3 bit_rate = 768000; break; case 20: // level 2.0 bit_rate = 2000000; break; case 21: // level 2.1 bit_rate = 4000000; break; case 22: // level 2.2 bit_rate = 4000000; break; case 30: // level 3.0 bit_rate = 10000000; break; case 31: // level 3.1 bit_rate = 14000000; break; case 32: // level 3.2 bit_rate = 20000000; break; case 40: // level 4.0 bit_rate = 20000000; break; case 41: // level 4.1 bit_rate = 50000000; break; case 42: // level 4.2 bit_rate = 50000000; break; case 50: // level 5.0 bit_rate = 135000000; break; case 51: // level 5.1 bit_rate = 240000000; break; default: break; } break; case 100: // high profile switch (level_idc) { case 10: // level 1.0 bit_rate = 80000; break; case 11: // level 1b / 1.1 bit_rate = constraint_set3_flag ? 160000 : 240000; break; case 12: // level 1.2 bit_rate = 480000; break; case 13: // level 1.3 bit_rate = 960000; break; case 20: // level 2.0 bit_rate = 2500000; break; case 21: // level 2.1 bit_rate = 5000000; break; case 22: // level 2.2 bit_rate = 5000000; break; case 30: // level 3.0 bit_rate = 12500000; break; case 31: // level 3.1 bit_rate = 17500000; break; case 32: // level 3.2 bit_rate = 25000000; break; case 40: // level 4.0 bit_rate = 25000000; break; case 41: // level 4.1 bit_rate = 62500000; break; case 42: // level 4.2 bit_rate = 62500000; break; case 50: // level 5.0 bit_rate = 168750000; break; case 51: // level 5.1 bit_rate = 300000000; break; default: break; } break; case 110: // high 10 profile switch (level_idc) { case 10: // level 1.0 bit_rate = 192000; break; case 11: // level 1b / 1.1 bit_rate = constraint_set3_flag ? 384000 : 576000; break; case 12: // level 1.2 bit_rate = 115200; break; case 13: // level 1.3 bit_rate = 2304000; break; case 20: // level 2.0 bit_rate = 6000000; break; case 21: // level 2.1 bit_rate = 12000000; break; case 22: // level 2.2 bit_rate = 12000000; break; case 30: // level 3.0 bit_rate = 30000000; break; case 31: // level 3.1 bit_rate = 42000000; break; case 32: // level 3.2 bit_rate = 60000000; break; case 40: // level 4.0 bit_rate = 60000000; break; case 41: // level 4.1 bit_rate = 150000000; break; case 42: // level 4.2 bit_rate = 150000000; break; case 50: // level 5.0 bit_rate = 405000000; break; case 51: // level 5.1 bit_rate = 720000000; break; default: break; } break; case 122: // high 4:2:2 profile case 144: // high 4:4:4 profile switch (level_idc) { case 10: // level 1.0 bit_rate = 256000; break; case 11: // level 1b / 1.1 bit_rate = constraint_set3_flag ? 512000 : 768000; break; case 12: // level 1.2 bit_rate = 1536000; break; case 13: // level 1.3 bit_rate = 3072000; break; case 20: // level 2.0 bit_rate = 8000000; break; case 21: // level 2.1 bit_rate = 16000000; break; case 22: // level 2.2 bit_rate = 16000000; break; case 30: // level 3.0 bit_rate = 40000000; break; case 31: // level 3.1 bit_rate = 56000000; break; case 32: // level 3.2 bit_rate = 80000000; break; case 40: // level 4.0 bit_rate = 80000000; break; case 41: // level 4.1 bit_rate = 200000000; break; case 42: // level 4.2 bit_rate = 200000000; break; case 50: // level 5.0 bit_rate = 540000000; break; case 51: // level 5.1 bit_rate = 960000000; break; default: break; } break; default: break; } if ((profile_idc == 100) || (profile_idc == 110) || (profile_idc == 122) || (profile_idc == 144)) { if (bs.GetUeGolomb() == 3) // chroma_format_idc bs.SkipBit(); // residual_colour_transform_flag bs.SkipUeGolomb(); // bit_depth_luma_minus8 bs.SkipUeGolomb(); // bit_depth_chroma_minus8 bs.SkipBit(); // qpprime_y_zero_transform_bypass_flag if (bs.GetBit()) { // seq_scaling_matrix_present_flag for (i = 0; i < 8; ++i) { if (bs.GetBit()) { // seq_scaling_list_present_flag[i] int last = 8, next = 8, size = (i < 6) ? 16 : 64; for (j = 0; j < size; ++j) { if (next) next = (last + bs.GetSeGolomb()) & 0xff; last = next ?: last; } } } } } bs.SkipUeGolomb(); // log2_max_frame_num_minus4 pic_order_cnt_type = bs.GetUeGolomb(); // pic_order_cnt_type if (pic_order_cnt_type == 0) bs.SkipUeGolomb(); // log2_max_pic_order_cnt_lsb_minus4 else if (pic_order_cnt_type == 1) { bs.SkipBit(); // delta_pic_order_always_zero bs.SkipSeGolomb(); // offset_for_non_ref_pic bs.SkipSeGolomb(); // offset_for_top_to_bottom_field j = bs.GetUeGolomb(); // num_ref_frames_in_pic_order_cnt_cycle for (i = 0; i < j; ++i) bs.SkipSeGolomb(); // offset_for_ref_frame[i] } bs.SkipUeGolomb(); // num_ref_frames bs.SkipBit(); // gaps_in_frame_num_value_allowed_flag width = bs.GetUeGolomb() + 1; // pic_width_in_mbs_minus1 height = bs.GetUeGolomb() + 1; // pic_height_in_mbs_minus1 frame_mbs_only_flag = bs.GetBit(); // frame_mbs_only_flag debug2("%s pic_width=%u", __PRETTY_FUNCTION__, width); debug2("%s pic_height=%u", __PRETTY_FUNCTION__, height); debug2("%s frame_mbs_only_flag=%d", __PRETTY_FUNCTION__, frame_mbs_only_flag); width *= 16; height *= 16 * (frame_mbs_only_flag ? 1 : 2); if (!frame_mbs_only_flag) mb_adaptive_frame_field_flag = bs.GetBit(); // mb_adaptive_frame_field_flag bs.SkipBit(); // direct_8x8_inference_flag if (bs.GetBit()) { // frame_cropping_flag uint32_t crop_left, crop_right, crop_top, crop_bottom; crop_left = bs.GetUeGolomb(); // frame_crop_left_offset crop_right = bs.GetUeGolomb(); // frame_crop_rigth_offset crop_top = bs.GetUeGolomb(); // frame_crop_top_offset crop_bottom = bs.GetUeGolomb(); // frame_crop_bottom_offset debug2("%s crop_left=%d crop_top=%d crop_right=%d crop_bottom=%d", __PRETTY_FUNCTION__, crop_left, crop_top, crop_right, crop_bottom); width -= 2 * (crop_left + crop_right); if (frame_mbs_only_flag) height -= 2 * (crop_top + crop_bottom); else height -= 4 * (crop_top + crop_bottom); } // VUI parameters if (bs.GetBit()) { // vui_parameters_present_flag if (bs.GetBit()) { // aspect_ratio_info_present uint32_t aspect_ratio_idc, sar_width = 0, sar_height = 0; aspect_ratio_idc = bs.GetBits(8); // aspect_ratio_idc debug2("%s aspect_ratio_idc=%d", __PRETTY_FUNCTION__, aspect_ratio_idc); if (aspect_ratio_idc == 255) { // extended sar sar_width = bs.GetBits(16); // sar_width sar_height = bs.GetBits(16); // sar_height } else if (aspect_ratio_idc < ELEMENTS(sarS)) { sar_width = sarS[aspect_ratio_idc].w; sar_height = sarS[aspect_ratio_idc].h; } if (sar_width && sar_height) { int index = -1, ratio = int(100.0L * sar_width * width / sar_height / height); for (unsigned int i = 0; i < ELEMENTS(darS); ++i) { if (darS[i].ratio == ratio) { index = i; break; } } if (index < 0) { if (aspect_ratio_idc == 255) aspect_ratio = VIDEO_ASPECT_RATIO_EXTENDED; else aspect_ratio = VIDEO_ASPECT_RATIO_INVALID; } else aspect_ratio = darS[index].dar; debug2("%s sar_width=%d sar_height=%d aspect_ratio=%d", __PRETTY_FUNCTION__, sar_width, sar_height, aspect_ratio); } } if (bs.GetBit()) // overscan_info_present_flag bs.SkipBit(); // overscan_approriate_flag if (bs.GetBit()) { // video_signal_type_present_flag uint32_t video_format; video_format = bs.GetBits(3); // video_format if (video_format < sizeof(videoFormatS) / sizeof(videoFormatS[0])) { format = videoFormatS[video_format]; debug2("%s video_format=%d", __PRETTY_FUNCTION__, format); } bs.SkipBit(); // video_full_range_flag if (bs.GetBit()) { // colour_description_present_flag bs.SkipBits(8); // colour_primaries bs.SkipBits(8); // transfer_characteristics bs.SkipBits(8); // matrix_coefficients } } if (bs.GetBit()) { // chroma_loc_info_present_flag bs.SkipUeGolomb(); // chroma_sample_loc_type_top_field bs.SkipUeGolomb(); // chroma_sample_loc_type_bottom_field } if (bs.GetBit()) { // timing_info_present_flag uint32_t num_units_in_tick, time_scale; num_units_in_tick = bs.GetBits(32); // num_units_in_tick time_scale = bs.GetBits(32); // time_scale if (num_units_in_tick > 0) frame_rate = time_scale / num_units_in_tick; bs.SkipBit(); // fixed_frame_rate_flag } int nal_hrd_parameters_present_flag = bs.GetBit(); // nal_hrd_parameters_present_flag if (nal_hrd_parameters_present_flag) { int cpb_cnt_minus1; cpb_cnt_minus1 = bs.GetUeGolomb(); // cpb_cnt_minus1 bs.SkipBits(4); // bit_rate_scale bs.SkipBits(4); // cpb_size_scale for (int i = 0; i < cpb_cnt_minus1; ++i) { bs.SkipUeGolomb(); // bit_rate_value_minus1[i] bs.SkipUeGolomb(); // cpb_size_value_minus1[i] bs.SkipBit(); // cbr_flag[i] } bs.SkipBits(5); // initial_cpb_removal_delay_length_minus1 bs.SkipBits(5); // cpb_removal_delay_length_minus1 bs.SkipBits(5); // dpb_output_delay_length_minus1 time_offset_length = bs.GetBits(5); // time_offset_length } int vlc_hrd_parameters_present_flag = bs.GetBit(); // vlc_hrd_parameters_present_flag if (vlc_hrd_parameters_present_flag) { int cpb_cnt_minus1; cpb_cnt_minus1 = bs.GetUeGolomb(); // cpb_cnt_minus1 bs.SkipBits(4); // bit_rate_scale bs.SkipBits(4); // cpb_size_scale for (int i = 0; i < cpb_cnt_minus1; ++i) { bs.SkipUeGolomb(); // bit_rate_value_minus1[i] bs.SkipUeGolomb(); // cpb_size_value_minus1[i] bs.SkipBit(); // cbr_flag[i] } bs.SkipBits(5); // initial_cpb_removal_delay_length_minus1 bs.SkipBits(5); // cpb_removal_delay_length_minus1 bs.SkipBits(5); // dpb_output_delay_length_minus1 time_offset_length = bs.GetBits(5);// time_offset_length } cpb_dpb_delays_present_flag = (nal_hrd_parameters_present_flag | vlc_hrd_parameters_present_flag); if (cpb_dpb_delays_present_flag) bs.SkipBit(); // low_delay_hrd_flag pic_struct_present_flag = bs.GetBit(); // pic_struct_present_flag if (bs.GetBit()) { // bitstream_restriction_flag bs.SkipBit(); // motion_vectors_over_pic_boundaries_flag bs.SkipUeGolomb(); // max_bytes_per_pic_denom bs.SkipUeGolomb(); // max_bits_per_mb_denom bs.SkipUeGolomb(); // log2_max_mv_length_horizontal bs.SkipUeGolomb(); // log2_max_mv_length_vertical bs.SkipUeGolomb(); // num_reorder_frames bs.SkipUeGolomb(); // max_dec_frame_buffering } } widthM = width; heightM = height; aspectRatioM = aspect_ratio; formatM = format; scanM = frame_mbs_only_flag ? VIDEO_SCAN_PROGRESSIVE : VIDEO_SCAN_INTERLACED; frameRateM = frame_rate; bitRateM = bit_rate; cpbDpbDelaysPresentFlagM = cpb_dpb_delays_present_flag; picStructPresentFlagM = pic_struct_present_flag; frameMbsOnlyFlagM = frame_mbs_only_flag; mbAdaptiveFrameFieldFlagM = mb_adaptive_frame_field_flag; timeOffsetLengthM = time_offset_length; return (bs.Index() / 8); } int cFemonH264::parseSEI(const uint8_t *bufP, int lenP) { int num_referenced_subseqs, i; cFemonBitStream bs(bufP, lenP); eVideoScan scan = scanM; while ((bs.Index() * 8 + 16) < lenP) { // sei_message int lastByte, payloadSize = 0, payloadType = 0; do { lastByte = bs.GetBits(8) & 0xFF; payloadType += lastByte; } while (lastByte == 0xFF); // last_payload_type_byte do { lastByte = bs.GetBits(8) & 0xFF; payloadSize += lastByte; } while (lastByte == 0xFF); // last_payload_size_byte switch (payloadType) { // sei_payload case 1: // pic_timing if (cpbDpbDelaysPresentFlagM) { // cpb_dpb_delays_present_flag bs.SkipUeGolomb(); // cpb_removal_delay bs.SkipUeGolomb(); // dpb_output_delay } if (picStructPresentFlagM) { // pic_struct_present_flag uint32_t pic_struct, ct_type = 0, i = 0; pic_struct = bs.GetBits(4); // pic_struct if (pic_struct >= (sizeof(seiNumClockTsTableS)) / sizeof(seiNumClockTsTableS[0])) return 0; if (frameMbsOnlyFlagM && !mbAdaptiveFrameFieldFlagM) scan = VIDEO_SCAN_PROGRESSIVE; else { switch (pic_struct) { case 0: // frame case 7: // frame doubling case 8: // frame tripling scan = VIDEO_SCAN_PROGRESSIVE; break; case 1: // top case 2: // bottom case 3: // top bottom case 4: // bottom top case 5: // top bottom top case 6: // bottom top bottom scan = VIDEO_SCAN_INTERLACED; break; default: scan = VIDEO_SCAN_RESERVED; break; } } debug2("%s pic_struct=%d scan_type=%d", __PRETTY_FUNCTION__, pic_struct, scan); for (i = 0; i < seiNumClockTsTableS[pic_struct]; ++i) { if (bs.GetBit()) { // clock_timestamp_flag[i] int full_timestamp_flag; ct_type |= (1 << bs.GetBits(2)); // ct_type debug2("%s ct_type=%04X", __PRETTY_FUNCTION__, ct_type); bs.SkipBit(); // nuit_field_based_flag bs.SkipBits(5); // counting_type full_timestamp_flag = bs.GetBit(); // full_timestamp_flag bs.SkipBit(); // discontinuity_flag bs.SkipBit(); // cnt_dropped_flag bs.SkipBits(8); // n_frames if (full_timestamp_flag) { bs.SkipBits(6); // seconds_value bs.SkipBits(6); // minutes_value bs.SkipBits(5); // hours_value } else { if (bs.GetBit()) { // seconds_flag bs.SkipBits(6); // seconds_value if (bs.GetBit()) { // minutes_flag bs.SkipBits(6); // minutes_value if (bs.GetBit()) // hours_flag bs.SkipBits(5); // hours_value } } } if (timeOffsetLengthM > 0) bs.SkipBits(timeOffsetLengthM); // time_offset } } if (i > 0) scan = (ct_type & (1 << 1)) ? VIDEO_SCAN_INTERLACED : VIDEO_SCAN_PROGRESSIVE; } break; case 12: // sub_seq_characteristics bs.SkipUeGolomb(); // sub_seq_layer_num bs.SkipUeGolomb(); // sub_seq_id if (bs.GetBit()) // duration_flag bs.SkipBits(32); // sub_seq_duration if (bs.GetBit()) { // average_rate_flag bs.SkipBit(); // accurate_statistics_flag bs.SkipBits(16); // average_bit_rate (1000 bit/s) bs.SkipBits(16); // average_frame_rate (frames per 256s) } num_referenced_subseqs = bs.GetUeGolomb(); // num_referenced_subseqs for (i = 0; i < num_referenced_subseqs; ++i) { bs.SkipUeGolomb(); // ref_sub_seq_layer_num bs.SkipUeGolomb(); // ref_sub_seq_id bs.GetBit(); // ref_sub_seq_direction } break; default: bs.SkipBits(payloadSize * 8); break; } // force byte align bs.ByteAlign(); } scanM = scan; return (bs.Index() / 8); } femon-2.2.1/README0000644000000000000000000001066112507636100012202 0ustar rootrootThis is a DVB Frontend Status Monitor plugin for the Video Disk Recorder (VDR). Written by: Rolf Ahrenberg < R o l f . A h r e n b e r g @ s c i . f i > Project's homepage: http://www.saunalahti.fi/~rahrenbe/vdr/femon/ Latest version available at: http://www.saunalahti.fi/~rahrenbe/vdr/femon/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING for license information. Requirements: VDR and a DVB card. Description: DVB Frontend Status Monitor is a plugin that displays some signal information parameters of the current tuned channel on OSD. You can zap through all your channels and the plugin should be monitoring always the right frontend. The transponder and stream information are also available in advanced display modes. The plugin is based on a neat console frontend status monitor application called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further information). Terminology: -------------------------------------------------------------- |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| |[=====Signal Strength ===================|=================]| |[=====Signal Quality ================|=====================]| | STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s | | SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s | | [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] | -------------------------------------------------------------- STR - Signal strength from driver SNR - Signal-to-noise ratio from driver BER - Bit error rate UNC - Uncorrected blocks Video - Calculated video bitrate in Mbit/s Audio - Calculated audio / AC-3 bitrate in kbit/s LOCK - Everything's working... SIGNAL - Found something above the noise level CARRIER - Found a DVB signal VITERBI - FEC (forward error correction) is stable SYNC - Found sync bytes SVDRP - SVDRP connection active (optional) AR - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional) VF - Video format: PAL/NTSC (optional) A/DD - Audio (0..N) / AC-3 track (optional) D - Device number: 0..N (optional) Controls: ChanUp/ChanDn - Switch channel up/down Up/Down - Switch channel up/down 0-9 - Select channel Ok - Switch between display modes: basic, transponder, stream, AC-3 Green - Select next audio track Yellow - Select audio channel: stereo, mono left, mono right Back - Exit plugin Left/Right - Switch to next/previous device that provides the current channel Installation: tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tgz make -C femon-X.Y.Z install Client-server architecture: The SVDRP service extension can be used in client-server configurations. A streamdev based VDR-to-VDR streaming client can retrieve frontend information from a server, if the SVDRP service has been activated and properly configured in femon. The svdrpservice plugin is required on the VDR client. If the client fails to open a DVB card frontend corresponding to the current receiving device, it will connect to the SVDRP server, look for the femon plugin and tune the channel on the server to the one currently viewed on the client. If one of these steps fails, the femon OSD won't open on the client. An SVDRP icon in the femon title bar indicates that the data source is SVDRP. The device number in the title bar is always the local device number. Notes: - Disable the stream analyze to speed up heavy zapping sessions. - The signal strength and signal-to-noise ratio values are comparable only between the same brand/model frontends. Due to the lack of proper frontend specifications those values cannot be calculated into any real units. - If the OSD isn't visible, you've configured the OSD height too big or too small. Please, try to adjust the variable on the OSD setup page before writing any bug reports. - If the SVDRP service is used: femon won't notice if the server is tuned to a different channel and tuning the channel on the server might annoy people watching live TV. In some situations the server will refuse switching to the requested channel. On a headless server you can avoid this by installing the dummydevice plugin. "Femon - A real womon who lives according to her natural feminine inclinations." femon-2.2.1/ac3.c0000644000000000000000000000541112507636100012131 0ustar rootroot/* * ac3.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * * AC3 Audio Header: http://www.atsc.org/standards/a_52a.pdf */ #include "tools.h" #include "ac3.h" int cFemonAC3::bitrateS[32] = { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int cFemonAC3::frequencieS[4] = { 480, 441, 320, 0 }; int cFemonAC3::frameS[3][32] = { {64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; cFemonAC3::cFemonAC3(cFemonAC3If *audioHandlerP) : audioHandlerM(audioHandlerP) { } cFemonAC3::~cFemonAC3() { } bool cFemonAC3::processAudio(const uint8_t *bufP, int lenP) { int fscod, frmsizcod, bsmod, acmod; int centermixlevel = AUDIO_CENTER_MIX_LEVEL_INVALID; int surroundmixlevel = AUDIO_SURROUND_MIX_LEVEL_INVALID; int dolbysurroundmode = AUDIO_DOLBY_SURROUND_MODE_INVALID; cFemonBitStream bs(bufP, lenP * 8); if (!audioHandlerM) return false; // skip PES header if (!PesLongEnough(lenP)) return false; bs.SkipBits(8 * PesPayloadOffset(bufP)); // http://rmworkshop.com/dvd_info/related_info/ac3hdr.htm // AC3 audio detection if (bs.GetBits(16) != 0x0B77) // syncword return false; bs.SkipBits(16); // CRC1 fscod = bs.GetBits(2); // sampling rate values frmsizcod = bs.GetBits(6); // frame size code bs.SkipBits(5); // bitstream id bsmod = bs.GetBits(3); // bitstream mode acmod = bs.GetBits(3); // audio coding mode // 3 front channels if ((acmod & 0x01) && (acmod != 0x01)) centermixlevel = bs.GetBits(2); // if a surround channel exists if (acmod & 0x04) surroundmixlevel = bs.GetBits(2); // if in 2/0 mode if (acmod == 0x02) dolbysurroundmode = bs.GetBits(2); audioHandlerM->SetAC3Bitrate(1000 * bitrateS[frmsizcod >> 1]); audioHandlerM->SetAC3SamplingFrequency(100 * frequencieS[fscod]); audioHandlerM->SetAC3Bitstream(bsmod); audioHandlerM->SetAC3AudioCoding(acmod); audioHandlerM->SetAC3CenterMix(centermixlevel); audioHandlerM->SetAC3SurroundMix(surroundmixlevel); audioHandlerM->SetAC3DolbySurround(dolbysurroundmode); audioHandlerM->SetAC3LFE(bs.GetBit()); // low frequency effects on audioHandlerM->SetAC3Dialog(bs.GetBits(5)); // dialog normalization return true; } femon-2.2.1/receiver.c0000644000000000000000000001621512507636100013273 0ustar rootroot/* * receiver.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include #include "config.h" #include "log.h" #include "tools.h" #include "receiver.h" cFemonReceiver::cFemonReceiver(const cChannel *channelP, int aTrackP, int dTrackP) : cReceiver(channelP), cThread("femon receiver"), mutexM(), sleepM(), activeM(false), detectH264M(this), detectMpegM(this, this), detectAacM(this), detectLatmM(this), detectAc3M(this), videoBufferM(KILOBYTE(512), TS_SIZE, false, "Femon video"), videoTypeM(channelP ? channelP->Vtype(): 0), videoPidM(channelP ? channelP->Vpid() : 0), videoPacketCountM(0), videoBitRateM(0.0), videoValidM(false), audioBufferM(KILOBYTE(256), TS_SIZE, false, "Femon audio"), audioPidM(channelP ? channelP->Apid(aTrackP) : 0), audioPacketCountM(0), audioBitRateM(0.0), audioValidM(false), ac3BufferM(KILOBYTE(256), TS_SIZE, false, "Femon AC3"), ac3PidM(channelP ? channelP->Dpid(dTrackP) : 0), ac3PacketCountM(0), ac3BitRateM(0), ac3ValidM(false) { debug1("%s (, %d, %d)", __PRETTY_FUNCTION__, aTrackP, dTrackP); SetPids(NULL); AddPid(videoPidM); AddPid(audioPidM); AddPid(ac3PidM); videoBufferM.SetTimeouts(0, 100); audioBufferM.SetTimeouts(0, 100); ac3BufferM.SetTimeouts(0, 100); videoInfoM.codec = VIDEO_CODEC_INVALID; videoInfoM.format = VIDEO_FORMAT_INVALID; videoInfoM.scan = VIDEO_SCAN_INVALID; videoInfoM.aspectRatio = VIDEO_ASPECT_RATIO_INVALID; videoInfoM.width = 0; videoInfoM.height = 0; videoInfoM.frameRate = 0; videoInfoM.bitrate = AUDIO_BITRATE_INVALID; audioInfoM.codec = AUDIO_CODEC_UNKNOWN; audioInfoM.bitrate = AUDIO_BITRATE_INVALID; audioInfoM.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID; audioInfoM.channelMode = AUDIO_CHANNEL_MODE_INVALID; ac3InfoM.bitrate = AUDIO_BITRATE_INVALID; ac3InfoM.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID; ac3InfoM.bitstreamMode = AUDIO_BITSTREAM_MODE_INVALID; ac3InfoM.audioCodingMode = AUDIO_CODING_MODE_INVALID; ac3InfoM.dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID; ac3InfoM.centerMixLevel = AUDIO_CENTER_MIX_LEVEL_INVALID; ac3InfoM.surroundMixLevel = AUDIO_SURROUND_MIX_LEVEL_INVALID; ac3InfoM.dialogLevel = 0; ac3InfoM.lfe = false; } cFemonReceiver::~cFemonReceiver(void) { debug1("%s", __PRETTY_FUNCTION__); Deactivate(); } void cFemonReceiver::Deactivate(void) { debug1("%s", __PRETTY_FUNCTION__); Detach(); if (activeM) { activeM = false; sleepM.Signal(); if (Running()) Cancel(3); } } void cFemonReceiver::Activate(bool onP) { debug1("%s (%d)", __PRETTY_FUNCTION__, onP); if (onP) Start(); else Deactivate(); } void cFemonReceiver::Receive(uchar *dataP, int lengthP) { // TS packet length: TS_SIZE if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) { int len, pid = TsPid(dataP); if (pid == videoPidM) { ++videoPacketCountM; len = videoBufferM.Put(dataP, lengthP); if (len != lengthP) { videoBufferM.ReportOverflow(lengthP - len); videoBufferM.Clear(); } } else if (pid == audioPidM) { ++audioPacketCountM; len = audioBufferM.Put(dataP, lengthP); if (len != lengthP) { audioBufferM.ReportOverflow(lengthP - len); audioBufferM.Clear(); } } else if (pid == ac3PidM) { ++ac3PacketCountM; len = ac3BufferM.Put(dataP, lengthP); if (len != lengthP) { ac3BufferM.ReportOverflow(lengthP - len); ac3BufferM.Clear(); } } } } void cFemonReceiver::Action(void) { debug1("%s", __PRETTY_FUNCTION__); cTimeMs calcPeriod(0); activeM = true; while (Running() && activeM) { uint8_t *Data; double timeout; int len, Length; bool processed = false; // process available video data while ((Data = videoBufferM.Get(Length))) { if (!activeM || (Length < TS_SIZE)) break; Length = TS_SIZE; if (*Data != TS_SYNC_BYTE) { for (int i = 1; i < Length; ++i) { if (Data[i] == TS_SYNC_BYTE) { Length = i; break; } } videoBufferM.Del(Length); continue; } processed = true; if (TsPayloadStart(Data)) { while (const uint8_t *p = videoAssemblerM.GetPes(len)) { if (videoTypeM == 0x1B) { // MPEG4 if (detectH264M.processVideo(p, len)) { videoValidM = true; break; } } else { if (detectMpegM.processVideo(p, len)) { videoValidM = true; break; } } } videoAssemblerM.Reset(); } videoAssemblerM.PutTs(Data, Length); videoBufferM.Del(Length); } // process available audio data while ((Data = audioBufferM.Get(Length))) { if (!activeM || (Length < TS_SIZE)) break; Length = TS_SIZE; if (*Data != TS_SYNC_BYTE) { for (int i = 1; i < Length; ++i) { if (Data[i] == TS_SYNC_BYTE) { Length = i; break; } } audioBufferM.Del(Length); continue; } processed = true; if (const uint8_t *p = audioAssemblerM.GetPes(len)) { if (detectAacM.processAudio(p, len) || detectLatmM.processAudio(p, len) || detectMpegM.processAudio(p, len)) audioValidM = true; audioAssemblerM.Reset(); } audioAssemblerM.PutTs(Data, Length); audioBufferM.Del(Length); } // process available dolby data while ((Data = ac3BufferM.Get(Length))) { if (!activeM || (Length < TS_SIZE)) break; Length = TS_SIZE; if (*Data != TS_SYNC_BYTE) { for (int i = 1; i < Length; ++i) { if (Data[i] == TS_SYNC_BYTE) { Length = i; break; } } ac3BufferM.Del(Length); continue; } processed = true; if (const uint8_t *p = ac3AssemblerM.GetPes(len)) { if (detectAc3M.processAudio(p, len)) ac3ValidM = true; ac3AssemblerM.Reset(); } ac3AssemblerM.PutTs(Data, Length); ac3BufferM.Del(Length); } // calculate bitrates timeout = double(calcPeriod.Elapsed()); if (activeM && (timeout >= (100.0 * FemonConfig.GetCalcInterval()))) { // TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit // PES headers should be compensated! videoBitRateM = (1000.0 * 8.0 * 184.0 * videoPacketCountM) / timeout; videoPacketCountM = 0; audioBitRateM = (1000.0 * 8.0 * 184.0 * audioPacketCountM) / timeout; audioPacketCountM = 0; ac3BitRateM = (1000.0 * 8.0 * 184.0 * ac3PacketCountM) / timeout; ac3PacketCountM = 0; calcPeriod.Set(0); } if (!processed) sleepM.Wait(10); // to avoid busy loop and reduce cpu load } } femon-2.2.1/po/0000755000000000000000000000000012507745733011751 5ustar rootrootfemon-2.2.1/po/it_IT.po0000644000000000000000000001571112507745733013326 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Sean Carlos # Diego Pierotto # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Diego Pierotto \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Italian\n" "X-Poedit-Country: ITALY\n" "X-Poedit-SourceCharset: utf-8\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "Mostra info segnale DVB (OSD)" msgid "Signal Information" msgstr "Info segnale" msgid "Femon not available" msgstr "Femon non disponibile" msgid "Video" msgstr "Video" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Audio" msgid "Transponder Information" msgstr "Informazioni transponder" msgid "Apid" msgstr "PID Audio" msgid "Dpid" msgstr "PID AC3" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Coderate" msgid "Protocol" msgstr "" msgid "Bitrate" msgstr "Bitrate" msgid "Stream Information" msgstr "Informazioni flusso" msgid "Video Stream" msgstr "Flusso video" msgid "Codec" msgstr "Codifica" msgid "Aspect Ratio" msgstr "Formato immagine" msgid "Frame Rate" msgstr "Frame rate" msgid "Video Format" msgstr "Formato video" msgid "Resolution" msgstr "Risoluzione" msgid "Audio Stream" msgstr "Flusso audio" msgid "Channel Mode" msgstr "Modalità canale" msgid "Sampling Frequency" msgstr "Frequenza campionamento" msgid "AC-3 Stream" msgstr "Flusso AC-3" msgid "Bit Stream Mode" msgstr "Modalità bitstream" msgid "Audio Coding Mode" msgstr "Modalità codifica audio" msgid "Center Mix Level" msgstr "Livello sonoro centrale" msgid "Surround Mix Level" msgstr "Livello sonoro surround" msgid "Dolby Surround Mode" msgstr "Modalità Dolby Surround" msgid "Low Frequency Effects" msgstr "Effetti bassa frequenza" msgid "Dialogue Normalization" msgstr "Normalizzazione dialoghi" msgid "basic" msgstr "base" msgid "transponder" msgstr "transponder" msgid "stream" msgstr "flusso" msgid "Classic" msgstr "Classico" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "SilverGreen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Nascondi voce menu principale" msgid "Define whether the main menu entry is hidden." msgstr "Definisci se la voce del menu principale è nascosta." msgid "Default display mode" msgstr "Modalità visualizz. predefinita" msgid "Define the default display mode at startup." msgstr "Definisci la modalità di visualizz. predefinita all'avvio." msgid "Define the used OSD skin." msgstr "Definisci lo stile interfaccia OSD utilizzato." msgid "Define the used OSD theme." msgstr "Definisci il tema OSD utilizzato." msgid "Position" msgstr "Posizione" msgid "Define the position of OSD." msgstr "Definisci la posizione dell'OSD." msgid "Downscale OSD size [%]" msgstr "Riduci dimensione OSD [%]" msgid "Define the downscale ratio for OSD size." msgstr "Definisci il rapporto di riduzione della dimensione OSD." msgid "Red limit [%]" msgstr "Limite rosso [%]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "Definisci un limite per la barra rossa, usata per indicare un cattivo segnale." msgid "Green limit [%]" msgstr "Limite verde [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "Definisci un limite per la barra verde, usata per indicare un buon segnale." msgid "OSD update interval [0.1s]" msgstr "Intervallo agg. OSD [0.1s]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "Definisci un intervallo per gli agg. OSD. Più piccolo è l'intervallo maggiore sarà l'uso di CPU." msgid "Analyze stream" msgstr "Analizza flusso" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "Definisci se il flusso DVB è analizzato e i bitrate calcolati." msgid "Calculation interval [0.1s]" msgstr "Intervallo di calcolo [0.1s]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "Definisci un intervallo di calcolo. L'intervallo più grande genera valori più stabili." msgid "Use SVDRP service" msgstr "Utilizza servizio SVDRP" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "Definisci se il servizio SVDRP viene usato nelle opzioni client/server." msgid "SVDRP service port" msgstr "Porta servizio SVDRP" msgid "Define the port number of SVDRP service." msgstr "Definisci il numero di porta del servizio SVDRP." msgid "SVDRP service IP" msgstr "IP servizio SVDRP" msgid "Define the IP address of SVDRP service." msgstr "Definisci l'indirizzo IP del servizio SVDRP." msgid "Help" msgstr "Aiuto" msgid "Fixed" msgstr "Fisso" msgid "Analog" msgstr "Analogico" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 Layer I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 Layer II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 Layer III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 Layer I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 Layer II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 Layer III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "stereo" msgid "joint Stereo" msgstr "joint Stereo" msgid "dual" msgstr "dual" msgid "mono" msgstr "mono" msgid "interlaced" msgstr "interlacciato" msgid "progressive" msgstr "progressivo" msgid "reserved" msgstr "riservato" msgid "extended" msgstr "esteso" msgid "unknown" msgstr "sconosciuto" msgid "component" msgstr "componente" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Principale (P)" msgid "Music and Effects (ME)" msgstr "Musica ed effetti (ME)" msgid "Visually Impaired (VI)" msgstr "Non vedenti (NV)" msgid "Hearing Impaired (HI)" msgstr "Non udenti (NU)" msgid "Dialogue (D)" msgstr "Dialogui (D)" msgid "Commentary (C)" msgstr "Commenti (C)" msgid "Emergency (E)" msgstr "Emergenza (E)" msgid "Voice Over (VO)" msgstr "Voce su (VS)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "Can. 1" msgid "Ch2" msgstr "Can. 2" msgid "C" msgstr "C" msgid "L" msgstr "S" msgid "R" msgstr "D" msgid "S" msgstr "S" msgid "SL" msgstr "SS" msgid "SR" msgstr "SD" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "non indicato" msgid "MHz" msgstr "MHz" msgid "free" msgstr "libero" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/po/es_ES.po0000644000000000000000000001334412507745733013314 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Luis Palacios # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Luis Palacios\n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "Monitorizacin de la seal DVB" msgid "Signal Information" msgstr "Monitorizacin de la seal DVB" msgid "Femon not available" msgstr "" msgid "Video" msgstr "Video" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Audio" msgid "Transponder Information" msgstr "Informacin del transpondedor" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Coderate" msgid "Protocol" msgstr "" msgid "Bitrate" msgstr "Tasa de bits" msgid "Stream Information" msgstr "Informacin del flujo" msgid "Video Stream" msgstr "Flujo de video" msgid "Codec" msgstr "" msgid "Aspect Ratio" msgstr "Proporciones de la imagen" msgid "Frame Rate" msgstr "Tasa de frames" msgid "Video Format" msgstr "Formato de video" msgid "Resolution" msgstr "Resolucin" msgid "Audio Stream" msgstr "Flujo de audio" msgid "Channel Mode" msgstr "" msgid "Sampling Frequency" msgstr "Frecuencia de muestreo" msgid "AC-3 Stream" msgstr "Flujo AC-3" msgid "Bit Stream Mode" msgstr "Modo bitstream" msgid "Audio Coding Mode" msgstr "Modo de codificacin de audio" msgid "Center Mix Level" msgstr "Nivel sonoro central" msgid "Surround Mix Level" msgstr "Nivel sonoro surround" msgid "Dolby Surround Mode" msgstr "Nivel sonoro Dolby Surround" msgid "Low Frequency Effects" msgstr "Efectos de baja frecuencia" msgid "Dialogue Normalization" msgstr "Normalizacin del dilogo" msgid "basic" msgstr "Bsico" msgid "transponder" msgstr "Transpondedor" msgid "stream" msgstr "Flujo" msgid "Classic" msgstr "Clsico" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "SilverGreen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Ocultar en el men principal" msgid "Define whether the main menu entry is hidden." msgstr "" msgid "Default display mode" msgstr "Modo de visualizacin estandar" msgid "Define the default display mode at startup." msgstr "" msgid "Define the used OSD skin." msgstr "" msgid "Define the used OSD theme." msgstr "" msgid "Position" msgstr "Posicin" msgid "Define the position of OSD." msgstr "" msgid "Downscale OSD size [%]" msgstr "" msgid "Define the downscale ratio for OSD size." msgstr "" msgid "Red limit [%]" msgstr "Lmite de rojo [%s]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "" msgid "Green limit [%]" msgstr "Lmite verde [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "" msgid "OSD update interval [0.1s]" msgstr "Intervalo de actualizacin (0,1)" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "" msgid "Analyze stream" msgstr "Analizar el flujo" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "" msgid "Calculation interval [0.1s]" msgstr "Intervalo de clculo (0,1s)" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "" msgid "Use SVDRP service" msgstr "" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "" msgid "SVDRP service port" msgstr "" msgid "Define the port number of SVDRP service." msgstr "" msgid "SVDRP service IP" msgstr "" msgid "Define the IP address of SVDRP service." msgstr "" msgid "Help" msgstr "Ayuda" msgid "Fixed" msgstr "Fijo" msgid "Analog" msgstr "Analgico" msgid "MPEG-2" msgstr "" msgid "H.264" msgstr "" msgid "MPEG-1 Layer I" msgstr "" msgid "MPEG-1 Layer II" msgstr "" msgid "MPEG-1 Layer III" msgstr "" msgid "MPEG-2 Layer I" msgstr "" msgid "MPEG-2 Layer II" msgstr "" msgid "MPEG-2 Layer III" msgstr "" msgid "HE-AAC" msgstr "" msgid "LATM" msgstr "" msgid "stereo" msgstr "" msgid "joint Stereo" msgstr "" msgid "dual" msgstr "" msgid "mono" msgstr "o" msgid "interlaced" msgstr "" msgid "progressive" msgstr "" msgid "reserved" msgstr "reservado" msgid "extended" msgstr "" msgid "unknown" msgstr "desconocido" msgid "component" msgstr "" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "" msgid "MAC" msgstr "" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Principal (CM)" msgid "Music and Effects (ME)" msgstr "Msica y efectos (ME)" msgid "Visually Impaired (VI)" msgstr "Imagen deteriorada (VI)" msgid "Hearing Impaired (HI)" msgstr "Hearing deteriorado" msgid "Dialogue (D)" msgstr "Dilogo (D)" msgid "Commentary (C)" msgstr "Comentario (C)" msgid "Emergency (E)" msgstr "Emergencia (E)" msgid "Voice Over (VO)" msgstr "Voz off (VO)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "Can. 1" msgid "Ch2" msgstr "Can. 2" msgid "C" msgstr "C" msgid "L" msgstr "I" msgid "R" msgstr "D" msgid "S" msgstr "S" msgid "SL" msgstr "SI" msgid "SR" msgstr "SD" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "no indicado" msgid "MHz" msgstr "MHz" msgid "free" msgstr "libre" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/po/sk_SK.po0000644000000000000000000001533512507745733013332 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Milan Hrala # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Milan Hrala \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "DVB Informcie o signle (OSD)" msgid "Signal Information" msgstr "Informcie o signle" msgid "Femon not available" msgstr "Femon nie je k dispozcii" msgid "Video" msgstr "Video" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Zvuk" msgid "Transponder Information" msgstr "Informcie transpondra" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "rchlos kdovania" msgid "Protocol" msgstr "Protokol" msgid "Bitrate" msgstr "Dtov tok" msgid "Stream Information" msgstr "Informcie o dtovom toku" msgid "Video Stream" msgstr "Video stopa" msgid "Codec" msgstr "kodek" msgid "Aspect Ratio" msgstr "Pomer strn" msgid "Frame Rate" msgstr "Poet snmkov" msgid "Video Format" msgstr "Video formt" msgid "Resolution" msgstr "Rozlenie" msgid "Audio Stream" msgstr "Zvukov stopa" msgid "Channel Mode" msgstr "reim kanla" msgid "Sampling Frequency" msgstr "Vzorkovacia frekvencia" msgid "AC-3 Stream" msgstr "AC-3 dtov tok" msgid "Bit Stream Mode" msgstr "reim bitovho toku" msgid "Audio Coding Mode" msgstr "Rem kdovania zvuku" msgid "Center Mix Level" msgstr "rove Center mix" msgid "Surround Mix Level" msgstr "rove Surround mix" msgid "Dolby Surround Mode" msgstr "Dolby Surround rem" msgid "Low Frequency Effects" msgstr "Basov efekty" msgid "Dialogue Normalization" msgstr "tandartn dialg" msgid "basic" msgstr "tandardtn" msgid "transponder" msgstr "Transpondr" msgid "stream" msgstr "dtov tok" msgid "Classic" msgstr "Klasick" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "tmavo modr" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "strieborno zelen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Schova poloku v hlavnom menu" msgid "Define whether the main menu entry is hidden." msgstr "Urite, i v hlavnom menu bude poloka skryt." msgid "Default display mode" msgstr "tandardn reim zobrazenia" msgid "Define the default display mode at startup." msgstr "Zadajte predvolen reim zobrazenia pri spusten." msgid "Define the used OSD skin." msgstr "Zadajte pouit OSD vzhad." msgid "Define the used OSD theme." msgstr "Definujte pouit OSD tmu." msgid "Position" msgstr "Pozcia" msgid "Define the position of OSD." msgstr "Definujte pozciu OSD." msgid "Downscale OSD size [%]" msgstr "Zmeni vekos OSD [%]" msgid "Define the downscale ratio for OSD size." msgstr "Zadajte zmenenie pomeru pre OSD vekosti." msgid "Red limit [%]" msgstr "erven limit [%]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "Zadajte limit pre erven pruh , ktor sa pouva na oznaenie zlho signlu." msgid "Green limit [%]" msgstr "Zelen limit [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "Zadajte limit pre zelenho pruhu, ktor sa pouije na oznaenie dobrho signlu." msgid "OSD update interval [0.1s]" msgstr "OSD aktualizan interval [0.1s]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "Zadajte interval pre aktualizcie OSD. Men interval vytvra vyie zaaenie CPU." msgid "Analyze stream" msgstr "Analza dtovho toku" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "Zadajte i sa DVB prd analyzuje a dtov tok vypota." msgid "Calculation interval [0.1s]" msgstr "Vpotov interval [0.1s]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "Zadajte interval pre vpoet. V interval vytvra stabilnejie hodnoty." msgid "Use SVDRP service" msgstr "Poui SVDRP slubu" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "Zadajte i sa pouije sluba SVDRP v klient / server nastaveniach." msgid "SVDRP service port" msgstr "Port SVDRP sluby" msgid "Define the port number of SVDRP service." msgstr "Zadajte slo portu sluby SVDRP." msgid "SVDRP service IP" msgstr "IP SVDRP sluby" msgid "Define the IP address of SVDRP service." msgstr "zadajte IP adresu sluby SVDRP." msgid "Help" msgstr "Pomoc" msgid "Fixed" msgstr "Pevn" msgid "Analog" msgstr "Analg" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 vrstva I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 vrstva II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 vrstva III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 vrstva I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 vrstva II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 vrstva III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "stereo" msgid "joint Stereo" msgstr "spojen stereo" msgid "dual" msgstr "dvojit" msgid "mono" msgstr "mono" msgid "interlaced" msgstr "prekladan" msgid "progressive" msgstr "progresvny" msgid "reserved" msgstr "obsaden" msgid "extended" msgstr "rozren" msgid "unknown" msgstr "neznmy" msgid "component" msgstr "sas" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Kompletne hlavn (CM)" msgid "Music and Effects (ME)" msgstr "Hudba a efekty (ME)" msgid "Visually Impaired (VI)" msgstr "zrakovo postihnut (VI)" msgid "Hearing Impaired (HI)" msgstr "sluchovo postihnut (HI)" msgid "Dialogue (D)" msgstr "Dialg (D)" msgid "Commentary (C)" msgstr "Komentr (C)" msgid "Emergency (E)" msgstr "Pohotovostn (E)" msgid "Voice Over (VO)" msgstr "Viacvrstvov hlas (VO)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "kanl1" msgid "Ch2" msgstr "kanl2" msgid "C" msgstr "C" msgid "L" msgstr "L" msgid "R" msgstr "R" msgid "S" msgstr "S" msgid "SL" msgstr "SL" msgid "SR" msgstr "SR" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "nie je uveden" msgid "MHz" msgstr "MHz" msgid "free" msgstr "von" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/po/de_DE.po0000644000000000000000000001335112507745733013254 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Peter Marquardt # Andreas Brachold # Christian Wieninger # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Christian Wieninger\n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "DVB Signal Informationsanzeige (OSD)" msgid "Signal Information" msgstr "Signalinformationen" msgid "Femon not available" msgstr "Femon nicht verfgbar" msgid "Video" msgstr "Video" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Audio" msgid "Transponder Information" msgstr "Transponderinformation" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Coderate" msgid "Protocol" msgstr "" msgid "Bitrate" msgstr "Bitrate" msgid "Stream Information" msgstr "Streaminformation" msgid "Video Stream" msgstr "Video Stream" msgid "Codec" msgstr "" msgid "Aspect Ratio" msgstr "Seitenverhltnis" msgid "Frame Rate" msgstr "Bildrate" msgid "Video Format" msgstr "Bildformat" msgid "Resolution" msgstr "Auflsung" msgid "Audio Stream" msgstr "Audio Stream" msgid "Channel Mode" msgstr "" msgid "Sampling Frequency" msgstr "Abtastrate" msgid "AC-3 Stream" msgstr "AC-3 Stream" msgid "Bit Stream Mode" msgstr "Bitstream Modus" msgid "Audio Coding Mode" msgstr "Audiokodierung" msgid "Center Mix Level" msgstr "Center Mix Pegel" msgid "Surround Mix Level" msgstr "Surround Mix Pegel" msgid "Dolby Surround Mode" msgstr "Dolby Surround Modus" msgid "Low Frequency Effects" msgstr "Tieftner Effekte" msgid "Dialogue Normalization" msgstr "Dialog Normalisierung" msgid "basic" msgstr "Standard" msgid "transponder" msgstr "Transponder" msgid "stream" msgstr "Stream" msgid "Classic" msgstr "Klassischer" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "SilverGreen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Hauptmeneintrag verstecken" msgid "Define whether the main menu entry is hidden." msgstr "" msgid "Default display mode" msgstr "Standard Anzeigemodus" msgid "Define the default display mode at startup." msgstr "" msgid "Define the used OSD skin." msgstr "" msgid "Define the used OSD theme." msgstr "" msgid "Position" msgstr "Position" msgid "Define the position of OSD." msgstr "" msgid "Downscale OSD size [%]" msgstr "" msgid "Define the downscale ratio for OSD size." msgstr "" msgid "Red limit [%]" msgstr "Grenze Rot [%]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "" msgid "Green limit [%]" msgstr "Grenze Grn [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "" msgid "OSD update interval [0.1s]" msgstr "OSD Updateintervall [0.1s]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "" msgid "Analyze stream" msgstr "Stream analysieren" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "" msgid "Calculation interval [0.1s]" msgstr "Berechnungsintervall [0.1s]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "" msgid "Use SVDRP service" msgstr "SVDRP Service verwenden" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "" msgid "SVDRP service port" msgstr "SVDRP Service Port" msgid "Define the port number of SVDRP service." msgstr "" msgid "SVDRP service IP" msgstr "SVDRP Service IP" msgid "Define the IP address of SVDRP service." msgstr "" msgid "Help" msgstr "Hilfe" msgid "Fixed" msgstr "Fest" msgid "Analog" msgstr "Analog" msgid "MPEG-2" msgstr "" msgid "H.264" msgstr "" msgid "MPEG-1 Layer I" msgstr "" msgid "MPEG-1 Layer II" msgstr "" msgid "MPEG-1 Layer III" msgstr "" msgid "MPEG-2 Layer I" msgstr "" msgid "MPEG-2 Layer II" msgstr "" msgid "MPEG-2 Layer III" msgstr "" msgid "HE-AAC" msgstr "" msgid "LATM" msgstr "" msgid "stereo" msgstr "" msgid "joint Stereo" msgstr "" msgid "dual" msgstr "" msgid "mono" msgstr "" msgid "interlaced" msgstr "" msgid "progressive" msgstr "" msgid "reserved" msgstr "belegt" msgid "extended" msgstr "" msgid "unknown" msgstr "unbekannt" msgid "component" msgstr "" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "" msgid "MAC" msgstr "" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Complete Main (CM)" msgid "Music and Effects (ME)" msgstr "Musik und Effekte (ME)" msgid "Visually Impaired (VI)" msgstr "Sehbehindert (VI)" msgid "Hearing Impaired (HI)" msgstr "Hrbehindert (HI)" msgid "Dialogue (D)" msgstr "Dialog (D)" msgid "Commentary (C)" msgstr "Kommentar (C)" msgid "Emergency (E)" msgstr "Notfall (E)" msgid "Voice Over (VO)" msgstr "berlagerte Stimme (VO)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "Kan1" msgid "Ch2" msgstr "Kan2" msgid "C" msgstr "C" msgid "L" msgstr "L" msgid "R" msgstr "R" msgid "S" msgstr "S" msgid "SL" msgstr "SL" msgid "SR" msgstr "SR" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "nicht angegeben" msgid "MHz" msgstr "MHz" msgid "free" msgstr "frei" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/po/et_EE.po0000644000000000000000000001500312507745733013271 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Arthur Konovalov # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Arthur Konovalov\n" "Language-Team: Estonian \n" "Language: et\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-13\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "DVB Signaalmonitor (OSD)" msgid "Signal Information" msgstr "Signaaliinfo" msgid "Femon not available" msgstr "Femon ei ole kttesaadav" msgid "Video" msgstr "Video" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Audio" msgid "Transponder Information" msgstr "Transponderi info" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Coderate" msgid "Protocol" msgstr "" msgid "Bitrate" msgstr "Bitikiirus" msgid "Stream Information" msgstr "Vooinfo" msgid "Video Stream" msgstr "Videovoog" msgid "Codec" msgstr "Koodek" msgid "Aspect Ratio" msgstr "Klgsuhe" msgid "Frame Rate" msgstr "Kaadrisagedus" msgid "Video Format" msgstr "Videoformaat" msgid "Resolution" msgstr "Resolutsioon" msgid "Audio Stream" msgstr "Audiovoog" msgid "Channel Mode" msgstr "Kanalimoodus" msgid "Sampling Frequency" msgstr "Smplimissagedus" msgid "AC-3 Stream" msgstr "AC-3 voog" msgid "Bit Stream Mode" msgstr "Bitivoo tp" msgid "Audio Coding Mode" msgstr "Audiokodeering" msgid "Center Mix Level" msgstr "Keskmise kanali tase" msgid "Surround Mix Level" msgstr "Surround kanali tase" msgid "Dolby Surround Mode" msgstr "Dolby Surround'i tp" msgid "Low Frequency Effects" msgstr "LFE kanal" msgid "Dialogue Normalization" msgstr "Dialoogi normalisatsioon" msgid "basic" msgstr "standard" msgid "transponder" msgstr "transponder" msgid "stream" msgstr "voog" msgid "Classic" msgstr "Classic" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "SilverGreen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Peita valik peamens" msgid "Define whether the main menu entry is hidden." msgstr "Valiku peamens peitmise mritlemine." msgid "Default display mode" msgstr "Vaikemoodus" msgid "Define the default display mode at startup." msgstr "Kivitamisel vaikemooduse mritlemine." msgid "Define the used OSD skin." msgstr "Kasutatava ekraanikesta mritlemine." msgid "Define the used OSD theme." msgstr "Kasutatava teema mritlemine." msgid "Position" msgstr "Positsioon" msgid "Define the position of OSD." msgstr "Ekraaniinfo positsiooni mritlemine." msgid "Downscale OSD size [%]" msgstr "Ekraanimen vhendamine [%]" msgid "Define the downscale ratio for OSD size." msgstr "Ekraanimen suuruse vhendamise mritlemine" msgid "Red limit [%]" msgstr "Punase limiit [%]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "Seaded punasele limiidile. Iseloomustab kehva signaali." msgid "Green limit [%]" msgstr "Rohelise limiit [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "Seaded rohelisele limiidile. Iseloomustab head signaali." msgid "OSD update interval [0.1s]" msgstr "Uuendusintervall [0,1s]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "Ekraaniinfo uuendamise intervalli mritlemine. Viksem intervall- suurem CPU koormus." msgid "Analyze stream" msgstr "Voo anals" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "DVB voo bitikiiruse rehkendamise mritlemine." msgid "Calculation interval [0.1s]" msgstr "Arvutamise intervall [0,1s]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "Arvutamise intervalli mritlemine. Suurem intervall annab stabiilsemaid tulemusi." msgid "Use SVDRP service" msgstr "SVDRP teenus" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "SVDRP teenuse klient/server seadete mritlemine." msgid "SVDRP service port" msgstr "SVDRP port" msgid "Define the port number of SVDRP service." msgstr "SVDRP teenuse pordi mritlemine." msgid "SVDRP service IP" msgstr "SVDRP IP" msgid "Define the IP address of SVDRP service." msgstr "SVDRP teenuse IP aadressi mritlemine." msgid "Help" msgstr "Abi" msgid "Fixed" msgstr "Fikseeritud" msgid "Analog" msgstr "Analoog" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 Layet I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 Layer II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 Layer III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 Layer I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 Layer II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 Layer III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "stereo" msgid "joint Stereo" msgstr "joint stereo" msgid "dual" msgstr "duaalne" msgid "mono" msgstr "mono" msgid "interlaced" msgstr "lerealaotus" msgid "progressive" msgstr "progressiivne" msgid "reserved" msgstr "reserv." msgid "extended" msgstr "laiendatud" msgid "unknown" msgstr "tundmatu" msgid "component" msgstr "komponentne" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Tiskomplekt (CM)" msgid "Music and Effects (ME)" msgstr "Muusika ja efektid (ME)" msgid "Visually Impaired (VI)" msgstr "Vaegngemine (VE)" msgid "Hearing Impaired (HI)" msgstr "Vaegkuulmine (HI)" msgid "Dialogue (D)" msgstr "Dialoog (D)" msgid "Commentary (C)" msgstr "Kommentaar (C)" msgid "Emergency (E)" msgstr "Hdateade (E)" msgid "Voice Over (VO)" msgstr "Pealerkimine (VO)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "Kan.1" msgid "Ch2" msgstr "Kan.2" msgid "C" msgstr "C" msgid "L" msgstr "L" msgid "R" msgstr "R" msgid "S" msgstr "S" msgid "SL" msgstr "SL" msgid "SR" msgstr "SR" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "mrkimata" msgid "MHz" msgstr "MHz" msgid "free" msgstr "vaba" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/po/zh_CN.po0000644000000000000000000001473412507745733013323 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Nan Feng VDR , 2009.2 # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: NanFeng \n" "Language-Team: Chinese (simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "卫星信号信息显示(OSD)" msgid "Signal Information" msgstr "频道信息浏览" msgid "Femon not available" msgstr "Femon插件无法使用" msgid "Video" msgstr "视频" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "音频" msgid "Transponder Information" msgstr "转发器信息" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "码速率" msgid "Protocol" msgstr "" msgid "Bitrate" msgstr "比特率" msgid "Stream Information" msgstr "流信息" msgid "Video Stream" msgstr "视频流" msgid "Codec" msgstr "解码模式" msgid "Aspect Ratio" msgstr "纵横比" msgid "Frame Rate" msgstr "帧速率" msgid "Video Format" msgstr "视频制式" msgid "Resolution" msgstr "分辨率" msgid "Audio Stream" msgstr "音频流" msgid "Channel Mode" msgstr "声道模式" msgid "Sampling Frequency" msgstr "采样频率" msgid "AC-3 Stream" msgstr "AC-3流" msgid "Bit Stream Mode" msgstr "比特流模式" msgid "Audio Coding Mode" msgstr "音频编码模式" msgid "Center Mix Level" msgstr "中心混合级别" msgid "Surround Mix Level" msgstr "环绕混合级别" msgid "Dolby Surround Mode" msgstr "杜比环绕声模式" msgid "Low Frequency Effects" msgstr "低频效果" msgid "Dialogue Normalization" msgstr "对话正常化" msgid "basic" msgstr "基本" msgid "transponder" msgstr "转发器" msgid "stream" msgstr "数据流" msgid "Classic" msgstr "经典" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "双色调" msgid "SilverGreen" msgstr "银绿" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "隐藏主菜单条目." msgid "Define whether the main menu entry is hidden." msgstr "确定是否进入主菜单是隐藏的." msgid "Default display mode" msgstr "默认启动时显示模式." msgid "Define the default display mode at startup." msgstr "定义默认启动时显示模式." msgid "Define the used OSD skin." msgstr "确定使用的菜单皮肤." msgid "Define the used OSD theme." msgstr "确定使用的菜单主题." msgid "Position" msgstr "位置" msgid "Define the position of OSD." msgstr "确定菜单的位置." msgid "Downscale OSD size [%]" msgstr "" msgid "Define the downscale ratio for OSD size." msgstr "" msgid "Red limit [%]" msgstr "红限制[ % ]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "定义一个限制红键,这是用来表示一个坏的信号." msgid "Green limit [%]" msgstr "绿限制[ % ]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "定义一个限制的绿色键,这是用来表示一个良好的信号." msgid "OSD update interval [0.1s]" msgstr "菜单更新间隔时间 [0.1s]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "确定一个OSD的更新时间间隔.较小的间隔产生较高的CPU负载." msgid "Analyze stream" msgstr "分析流" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "确定是否DVB流分析和比特率计算." msgid "Calculation interval [0.1s]" msgstr "计算时间间隔 [0.1s]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "定义一个时间间隔来计算.更大的时间价格产生将更稳定." msgid "Use SVDRP service" msgstr "使用SVDRP服务" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "定义是否SVDRP服务是用来在客户机/服务器的设置." msgid "SVDRP service port" msgstr "SVDRP服务端口" msgid "Define the port number of SVDRP service." msgstr "定义SVDRP服务的端口号." msgid "SVDRP service IP" msgstr "SVDRP服务的IP地址" msgid "Define the IP address of SVDRP service." msgstr "定义SVDRP服务的IP地址." msgid "Help" msgstr "帮助" msgid "Fixed" msgstr "固定" msgid "Analog" msgstr "模拟" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 Layer I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 Layer II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 Layer III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 Layer I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 Layer II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 Layer III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "立体声" msgid "joint Stereo" msgstr "联合立体声" msgid "dual" msgstr "双重" msgid "mono" msgstr "单声道" msgid "interlaced" msgstr "隔行扫描" msgid "progressive" msgstr "进步" msgid "reserved" msgstr "保留" msgid "extended" msgstr "扩展" msgid "unknown" msgstr "未知" msgid "component" msgstr "组件" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "赫兹" msgid "Complete Main (CM)" msgstr "完成主要 (CM)" msgid "Music and Effects (ME)" msgstr "音乐和效果 (ME)" msgid "Visually Impaired (VI)" msgstr "视障 (VI)" msgid "Hearing Impaired (HI)" msgstr "听障 (HI)" msgid "Dialogue (D)" msgstr "对话 (D)" msgid "Commentary (C)" msgstr "评论 (C)" msgid "Emergency (E)" msgstr "紧急 (E)" msgid "Voice Over (VO)" msgstr "旁白 (VO)" msgid "Karaoke" msgstr "卡拉OK" msgid "Ch1" msgstr "Ch1" msgid "Ch2" msgstr "Ch2" msgid "C" msgstr "C" msgid "L" msgstr "L" msgid "R" msgstr "R" msgid "S" msgstr "S" msgid "SL" msgstr "SL" msgid "SR" msgstr "SR" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "没有说明" msgid "MHz" msgstr "兆赫兹" msgid "free" msgstr "免费" msgid "Mbit/s" msgstr "兆位/秒" msgid "kbit/s" msgstr "千字节/秒" femon-2.2.1/po/zh_TW.po0000644000000000000000000001472612507745733013356 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Nan Feng VDR , 2009.2 # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: NanFeng \n" "Language-Team: Chinese (traditional) \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "衛星信號信息顯示(OSD)" msgid "Signal Information" msgstr "頻道信息瀏覽" msgid "Femon not available" msgstr "Femon插件無法使用" msgid "Video" msgstr "視頻" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "音頻" msgid "Transponder Information" msgstr "轉發器信息" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "碼速率" msgid "Protocol" msgstr "" msgid "Bitrate" msgstr "比特率" msgid "Stream Information" msgstr "流信息" msgid "Video Stream" msgstr "視頻流" msgid "Codec" msgstr "解碼模式" msgid "Aspect Ratio" msgstr "縱橫比" msgid "Frame Rate" msgstr "幀速率" msgid "Video Format" msgstr "視頻制式" msgid "Resolution" msgstr "分辨率" msgid "Audio Stream" msgstr "音頻流" msgid "Channel Mode" msgstr "聲道模式" msgid "Sampling Frequency" msgstr "採樣頻率" msgid "AC-3 Stream" msgstr "AC-3流" msgid "Bit Stream Mode" msgstr "比特流模式" msgid "Audio Coding Mode" msgstr "音頻編碼模式" msgid "Center Mix Level" msgstr "中心混合級別" msgid "Surround Mix Level" msgstr "環繞混合級別" msgid "Dolby Surround Mode" msgstr "杜比環繞聲模式" msgid "Low Frequency Effects" msgstr "低頻效果" msgid "Dialogue Normalization" msgstr "對話正常化" msgid "basic" msgstr "基本" msgid "transponder" msgstr "轉發器" msgid "stream" msgstr "數據流" msgid "Classic" msgstr "經典" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "雙色調" msgid "SilverGreen" msgstr "銀綠" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "隱藏主菜單條目." msgid "Define whether the main menu entry is hidden." msgstr "確定是否進入主菜單是隱藏的." msgid "Default display mode" msgstr "默認啟動時顯示模式." msgid "Define the default display mode at startup." msgstr "定義默認啟動時顯示模式." msgid "Define the used OSD skin." msgstr "確定使用的菜單皮膚." msgid "Define the used OSD theme." msgstr "確定使用的菜單主題." msgid "Position" msgstr "位置" msgid "Define the position of OSD." msgstr "確定菜單的位置." msgid "Downscale OSD size [%]" msgstr "" msgid "Define the downscale ratio for OSD size." msgstr "" msgid "Red limit [%]" msgstr "紅限制[ % ]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "定義一個限制紅鍵,這是用來表示一個壞的信號." msgid "Green limit [%]" msgstr "綠限制[ % ]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "定義一個限制的綠色鍵,這是用來表示一個良好的信號." msgid "OSD update interval [0.1s]" msgstr "菜單更新間隔時間[0.1s]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "確定一個OSD的更新時間間隔.較小的間隔產生較高的CPU負載." msgid "Analyze stream" msgstr "分析流" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "確定是否DVB流分析和比特率計算." msgid "Calculation interval [0.1s]" msgstr "計算時間間隔[0.1s]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "定義一個時間間隔來計算.更大的時間價格產生將更穩定." msgid "Use SVDRP service" msgstr "使用SVDRP服務" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "定義是否SVDRP服務是用來在客戶機/服務器的設置." msgid "SVDRP service port" msgstr "SVDRP服務端口" msgid "Define the port number of SVDRP service." msgstr "定義SVDRP服務的端口號." msgid "SVDRP service IP" msgstr "SVDRP服務的IP地址" msgid "Define the IP address of SVDRP service." msgstr "定義SVDRP服務的IP地址." msgid "Help" msgstr "幫助" msgid "Fixed" msgstr "固定" msgid "Analog" msgstr "模擬" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 Layer I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 Layer II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 Layer III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 Layer I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 Layer II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 Layer III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "立體聲" msgid "joint Stereo" msgstr "聯合立體聲" msgid "dual" msgstr "雙重" msgid "mono" msgstr "單聲道" msgid "interlaced" msgstr "隔行掃描" msgid "progressive" msgstr "進步" msgid "reserved" msgstr "保留" msgid "extended" msgstr "擴展" msgid "unknown" msgstr "未知" msgid "component" msgstr "組件" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "赫茲" msgid "Complete Main (CM)" msgstr "完成主要(CM)" msgid "Music and Effects (ME)" msgstr "音樂和效果(ME)" msgid "Visually Impaired (VI)" msgstr "視障(VI)" msgid "Hearing Impaired (HI)" msgstr "聽障(HI)" msgid "Dialogue (D)" msgstr "對話(D)" msgid "Commentary (C)" msgstr "評論(C)" msgid "Emergency (E)" msgstr "緊急(E)" msgid "Voice Over (VO)" msgstr "旁白(VO)" msgid "Karaoke" msgstr "卡拉OK" msgid "Ch1" msgstr "Ch1" msgid "Ch2" msgstr "Ch2" msgid "C" msgstr "C" msgid "L" msgstr "L" msgid "R" msgstr "R" msgid "S" msgstr "S" msgid "SL" msgstr "SL" msgid "SR" msgstr "SR" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "沒有說明" msgid "MHz" msgstr "兆赫茲" msgid "free" msgstr "免費" msgid "Mbit/s" msgstr "兆位/秒" msgid "kbit/s" msgstr "千字節/秒" femon-2.2.1/po/ru_RU.po0000644000000000000000000001227212507745733013351 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Vyacheslav Dikonov # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Vyacheslav Dikonov\n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-5\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr " " msgid "Signal Information" msgstr "" msgid "Femon not available" msgstr "" msgid "Video" msgstr "" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "" msgid "Transponder Information" msgstr " " msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Coderate" msgid "Protocol" msgstr "" msgid "Bitrate" msgstr "" msgid "Stream Information" msgstr "" msgid "Video Stream" msgstr "" msgid "Codec" msgstr "" msgid "Aspect Ratio" msgstr "" msgid "Frame Rate" msgstr "" msgid "Video Format" msgstr "" msgid "Resolution" msgstr "" msgid "Audio Stream" msgstr "" msgid "Channel Mode" msgstr "" msgid "Sampling Frequency" msgstr "" msgid "AC-3 Stream" msgstr "" msgid "Bit Stream Mode" msgstr "" msgid "Audio Coding Mode" msgstr "" msgid "Center Mix Level" msgstr "" msgid "Surround Mix Level" msgstr "" msgid "Dolby Surround Mode" msgstr "" msgid "Low Frequency Effects" msgstr "" msgid "Dialogue Normalization" msgstr "" msgid "basic" msgstr "" msgid "transponder" msgstr "" msgid "stream" msgstr "" msgid "Classic" msgstr "" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "SilverGreen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr " " msgid "Define whether the main menu entry is hidden." msgstr "" msgid "Default display mode" msgstr " " msgid "Define the default display mode at startup." msgstr "" msgid "Define the used OSD skin." msgstr "" msgid "Define the used OSD theme." msgstr "" msgid "Position" msgstr " " msgid "Define the position of OSD." msgstr "" msgid "Downscale OSD size [%]" msgstr "" msgid "Define the downscale ratio for OSD size." msgstr "" msgid "Red limit [%]" msgstr " (%)" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "" msgid "Green limit [%]" msgstr " (%)" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "" msgid "OSD update interval [0.1s]" msgstr " (0,1 )" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "" msgid "Analyze stream" msgstr " " msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "" msgid "Calculation interval [0.1s]" msgstr " (0,1 )" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "" msgid "Use SVDRP service" msgstr "" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "" msgid "SVDRP service port" msgstr "" msgid "Define the port number of SVDRP service." msgstr "" msgid "SVDRP service IP" msgstr "" msgid "Define the IP address of SVDRP service." msgstr "" msgid "Help" msgstr "" msgid "Fixed" msgstr "" msgid "Analog" msgstr "" msgid "MPEG-2" msgstr "" msgid "H.264" msgstr "" msgid "MPEG-1 Layer I" msgstr "" msgid "MPEG-1 Layer II" msgstr "" msgid "MPEG-1 Layer III" msgstr "" msgid "MPEG-2 Layer I" msgstr "" msgid "MPEG-2 Layer II" msgstr "" msgid "MPEG-2 Layer III" msgstr "" msgid "HE-AAC" msgstr "" msgid "LATM" msgstr "" msgid "stereo" msgstr "" msgid "joint Stereo" msgstr "" msgid "dual" msgstr "" msgid "mono" msgstr "" msgid "interlaced" msgstr "" msgid "progressive" msgstr "" msgid "reserved" msgstr "" msgid "extended" msgstr "" msgid "unknown" msgstr "" msgid "component" msgstr "" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "" msgid "MAC" msgstr "" msgid "Hz" msgstr "" msgid "Complete Main (CM)" msgstr "" msgid "Music and Effects (ME)" msgstr "" msgid "Visually Impaired (VI)" msgstr "" msgid "Hearing Impaired (HI)" msgstr "" msgid "Dialogue (D)" msgstr "" msgid "Commentary (C)" msgstr "" msgid "Emergency (E)" msgstr "" msgid "Voice Over (VO)" msgstr "" msgid "Karaoke" msgstr "" msgid "Ch1" msgstr "" msgid "Ch2" msgstr "" msgid "C" msgstr "" msgid "L" msgstr "" msgid "R" msgstr "" msgid "S" msgstr "" msgid "SL" msgstr "" msgid "SR" msgstr "" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "" msgid "MHz" msgstr "" msgid "free" msgstr "" msgid "Mbit/s" msgstr "/" msgid "kbit/s" msgstr "/" femon-2.2.1/po/uk_UA.po0000644000000000000000000002063512507745733013323 0ustar rootroot# Ukrainian translation. # Copyright (C) 2010 The Claws Mail Team # This file is distributed under the same license as the claws-mail package. # Yarema aka Knedlyk , 2010. msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Yarema aka Knedlyk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "Монітор інформації про DVB сигнал" msgid "Signal Information" msgstr "Інформація про сигнал" msgid "Femon not available" msgstr "Femon не доступний" msgid "Video" msgstr "Відео" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Аудіо" msgid "Transponder Information" msgstr "Інформація про транспондер" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Шв. кодування" msgid "Protocol" msgstr "Протокол" msgid "Bitrate" msgstr "Бітрейт" msgid "Stream Information" msgstr "Інформація про потік" msgid "Video Stream" msgstr "Відео потік" msgid "Codec" msgstr "Кодек" msgid "Aspect Ratio" msgstr "Співвідношення сторін" msgid "Frame Rate" msgstr "Частота кадрів" msgid "Video Format" msgstr "Формат відео" msgid "Resolution" msgstr "Роздільна здатність" msgid "Audio Stream" msgstr "Аудіо потік" msgid "Channel Mode" msgstr "Режим каналу" msgid "Sampling Frequency" msgstr "Частота" msgid "AC-3 Stream" msgstr "AC-3 потік" msgid "Bit Stream Mode" msgstr "Режим бітового потоку:" msgid "Audio Coding Mode" msgstr "Режим кодування малюнка" msgid "Center Mix Level" msgstr "Рівень міксування в центрі" msgid "Surround Mix Level" msgstr "Рівень міксування заповнення" msgid "Dolby Surround Mode" msgstr "Режим Dolby Surround" msgid "Low Frequency Effects" msgstr "Ефекти низької частоти" msgid "Dialogue Normalization" msgstr "Нормалізація гучності" msgid "basic" msgstr "основне" msgid "transponder" msgstr "транспондер" msgid "stream" msgstr "потік" msgid "Classic" msgstr "Класичний" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "SilverGreen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Сховати в головному меню" msgid "Define whether the main menu entry is hidden." msgstr "Визначення, чи приховувати в головному меню" msgid "Default display mode" msgstr "Типовий режим показу" msgid "Define the default display mode at startup." msgstr "Визначення типового режиму показу при запуску" msgid "Define the used OSD skin." msgstr "Визначення шкірки для повідомлень" msgid "Define the used OSD theme." msgstr "Визначення теми повідомлень" msgid "Position" msgstr "Позиція" msgid "Define the position of OSD." msgstr "Визначити позицію показу повідомлень" msgid "Downscale OSD size [%]" msgstr "Масштаб розміру повідомлень [%]" msgid "Define the downscale ratio for OSD size." msgstr "Визначити коефіцієнт масштабування розміру повідомлень" msgid "Red limit [%]" msgstr "Червона границя [%]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "Визначення границі червоної поділки, яка показує поганий сигнал." msgid "Green limit [%]" msgstr "Зелена границя [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "Визначення границі зеленої поділки, яка показує добрий сигнал." msgid "OSD update interval [0.1s]" msgstr "Інтервал оновлення повідомлень [0.1с]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "Визначення інтервалу оновлення повідомлень. Малий інтервал спричинює більше завантаження процесора." msgid "Analyze stream" msgstr "Аналіз потоку" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "Визначення, чи проводити аналіз DVB потоку і обчислення бітрейту" msgid "Calculation interval [0.1s]" msgstr "Інтервал обчислення [0.1с]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "Визначення інтервалу обчислення. Більший інтервал дає стабільніші значення." msgid "Use SVDRP service" msgstr "Використати SVDRP сервіс" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "Визначення чи буде використовуватися SVDRP сервіс в налаштуваннях клієнта/сервера" msgid "SVDRP service port" msgstr "Порт SVDRP сервісу" msgid "Define the port number of SVDRP service." msgstr "Визначення номеру порту SVDRP сервісу" msgid "SVDRP service IP" msgstr "IP сервісу SVDRP" msgid "Define the IP address of SVDRP service." msgstr "Визначення IP адреси сервісу SVDRP." msgid "Help" msgstr "Допомога" msgid "Fixed" msgstr "Фіксовано" msgid "Analog" msgstr "Аналог." msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 Layer I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 Layer II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 Layer III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 Layer I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 Layer II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 Layer III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "стерео" msgid "joint Stereo" msgstr "об’єднане стерео" msgid "dual" msgstr "дуальний" msgid "mono" msgstr "моно" msgid "interlaced" msgstr "черезрядкове" msgid "progressive" msgstr "прогресивне" msgid "reserved" msgstr "зарезервовано" msgid "extended" msgstr "розширено" msgid "unknown" msgstr "невідомо" msgid "component" msgstr "компонентно" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "Гц" msgid "Complete Main (CM)" msgstr "Заповнення основного (CM)" msgid "Music and Effects (ME)" msgstr "Музика і ефекти (ME)" msgid "Visually Impaired (VI)" msgstr "Слабозорі (VI)" msgid "Hearing Impaired (HI)" msgstr "Погіршений слух (HI)" msgid "Dialogue (D)" msgstr "Діалог (D)" msgid "Commentary (C)" msgstr "Коментарі (C)" msgid "Emergency (E)" msgstr "Аварійне (E)" msgid "Voice Over (VO)" msgstr "Голос через (VO)" msgid "Karaoke" msgstr "Караоке" msgid "Ch1" msgstr "Кан.1" msgid "Ch2" msgstr "Кан.2" msgid "C" msgstr "C" msgid "L" msgstr "L" msgid "R" msgstr "R" msgid "S" msgstr "S" msgid "SL" msgstr "SL" msgid "SR" msgstr "Симв.шв." msgid "dB" msgstr "дБ" msgid "not indicated" msgstr "не вказано" msgid "MHz" msgstr "МГц" msgid "free" msgstr "вільний" msgid "Mbit/s" msgstr "Мбіт/c" msgid "kbit/s" msgstr "кбіт/с" femon-2.2.1/po/fi_FI.po0000644000000000000000000001567212507745733013300 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Rolf Ahrenberg # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Rolf Ahrenberg\n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "Signaalimittari (OSD)" msgid "Signal Information" msgstr "Signaalimittari" msgid "Femon not available" msgstr "Signaalimittari ei ole käytettävissä" msgid "Video" msgstr "Kuva" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Ääni" msgid "Transponder Information" msgstr "Transponderin tiedot" msgid "Apid" msgstr "Ääni-PID" msgid "Dpid" msgstr "Dolby-PID" msgid "Spid" msgstr "Tekstitys-PID" msgid "Nid" msgstr "Verkko-ID" msgid "Tid" msgstr "TS-ID" msgid "Rid" msgstr "Radio-ID" msgid "Coderate" msgstr "Suojaustaso" msgid "Protocol" msgstr "Protokolla" msgid "Bitrate" msgstr "Bittinopeus" msgid "Stream Information" msgstr "Lähetteen tiedot" msgid "Video Stream" msgstr "Kuvaraita" msgid "Codec" msgstr "Koodekki" msgid "Aspect Ratio" msgstr "Kuvasuhde" msgid "Frame Rate" msgstr "Ruudunpäivitystaajuus" msgid "Video Format" msgstr "Kuvaformaatti" msgid "Resolution" msgstr "Resoluutio" msgid "Audio Stream" msgstr "Ääniraita" msgid "Channel Mode" msgstr "Kanavatila" msgid "Sampling Frequency" msgstr "Näytteenottotaajuus" msgid "AC-3 Stream" msgstr "AC-3-ääniraita" msgid "Bit Stream Mode" msgstr "Lähetteen tyyppi" msgid "Audio Coding Mode" msgstr "Äänikoodaus" msgid "Center Mix Level" msgstr "Keskikanavan taso" msgid "Surround Mix Level" msgstr "Tehostekanavien taso" msgid "Dolby Surround Mode" msgstr "Dolby Surround -tehoste" msgid "Low Frequency Effects" msgstr "LFE-kanava" msgid "Dialogue Normalization" msgstr "Dialogin normalisointi" msgid "basic" msgstr "perus" msgid "transponder" msgstr "transponderi" msgid "stream" msgstr "lähete" msgid "Classic" msgstr "Klassinen" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "SilverGreen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Piilota valinta päävalikosta" msgid "Define whether the main menu entry is hidden." msgstr "Määrittele, näytetäänkö laajennoksen valinta päävalikossa." msgid "Default display mode" msgstr "Oletusnäyttötila" msgid "Define the default display mode at startup." msgstr "Määrittele käytettävä näyttötila käynnistettäessä." msgid "Define the used OSD skin." msgstr "Määrittele käytettävä ulkoasu näytölle." msgid "Define the used OSD theme." msgstr "Määrittele käytettävä väriteema näytölle." msgid "Position" msgstr "Sijainti" msgid "Define the position of OSD." msgstr "Määrittele näytön sijainti." msgid "Downscale OSD size [%]" msgstr "Pienennä näytön kokoa [%]" msgid "Define the downscale ratio for OSD size." msgstr "Määrittele näytön pienennyssuhde." msgid "Red limit [%]" msgstr "Punaisen taso [%]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "Määrittele taso punaiselle palkille, jota käytetään huonon signaalin ilmaisimena." msgid "Green limit [%]" msgstr "Vihreän taso [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "Määrittele taso vihreälle palkille, jota käytetään hyvän signaalin ilmaisimena." msgid "OSD update interval [0.1s]" msgstr "Näytön päivitysväli [0.1s]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "Määrittele näytönvirkistystaajuus. Mitä pienempi arvo, sitä suurempi CPU-kuorma." msgid "Analyze stream" msgstr "Lähetteen analysointi" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "Määrittele, analysoidaanko DVB-lähetettä ja lasketaanko bittinopeuksia." msgid "Calculation interval [0.1s]" msgstr "Laskennan päivitysväli [0.1s]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "Määrittele laskentaikkunan koko. Mitä suurempi laskentaikkuna, sitä todenmukaisemmat lopputulokset." msgid "Use SVDRP service" msgstr "Käytä SVDRP-palvelua" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "Määrittele käytetäänkö SVDRP-palvelua asiakas/palvelin-kokoonpanoissa." msgid "SVDRP service port" msgstr "SVDRP-palvelun portti" msgid "Define the port number of SVDRP service." msgstr "Määrittele SVDRP-palvelun käyttämä portti." msgid "SVDRP service IP" msgstr "SVDRP-palvelun IP-osoite" msgid "Define the IP address of SVDRP service." msgstr "Määrittele SVDRP-palvelun käyttämä IP-osoite." msgid "Help" msgstr "Opaste" msgid "Fixed" msgstr "kiinteä" msgid "Analog" msgstr "analoginen" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 kerros I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 kerros II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 kerros III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 kerros I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 kerros II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 kerros III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "stereo" msgid "joint Stereo" msgstr "joint-stereo" msgid "dual" msgstr "kaksikanavainen" msgid "mono" msgstr "mono" msgid "interlaced" msgstr "lomiteltu" msgid "progressive" msgstr "lomittelematon" msgid "reserved" msgstr "varattu" msgid "extended" msgstr "laajennettu" msgid "unknown" msgstr "tuntematon" msgid "component" msgstr "komponentti" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Pääasiallinen (CM)" msgid "Music and Effects (ME)" msgstr "Musiikki ja tehosteet (ME)" msgid "Visually Impaired (VI)" msgstr "Näkörajoitteinen (VI)" msgid "Hearing Impaired (HI)" msgstr "Kuulorajoitteinen (HI)" msgid "Dialogue (D)" msgstr "Vuoropuhelu (D)" msgid "Commentary (C)" msgstr "Kommentointi (C)" msgid "Emergency (E)" msgstr "Hätätiedote (E)" msgid "Voice Over (VO)" msgstr "Päälle puhuttu (VO)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "kan. 1" msgid "Ch2" msgstr "kan. 2" msgid "C" msgstr "K" msgid "L" msgstr "V" msgid "R" msgstr "O" msgid "S" msgstr "T" msgid "SL" msgstr "TV" msgid "SR" msgstr "TO" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "ei ilmaistu" msgid "MHz" msgstr "MHz" msgid "free" msgstr "vapaa" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/po/lt_LT.po0000644000000000000000000001571412507745733013337 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Valdemaras Pipiras # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Valdemaras Pipiras \n" "Language-Team: Lithuanian \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "DVB signalo stebėjimas (OSD)" msgid "Signal Information" msgstr "Signalo informacija" msgid "Femon not available" msgstr "Femon įskiepas nepasiekiamas" msgid "Video" msgstr "Video" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Audio" msgid "Transponder Information" msgstr "Siųstuvo informacija" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Kodavimo dažnis" msgid "Protocol" msgstr "Protokolas" msgid "Bitrate" msgstr "Kokybė" msgid "Stream Information" msgstr "Srauto informacija" msgid "Video Stream" msgstr "Video srautas" msgid "Codec" msgstr "Kodekas" msgid "Aspect Ratio" msgstr "Proporcijos" msgid "Frame Rate" msgstr "Kadrų dažnis" msgid "Video Format" msgstr "Video formatas" msgid "Resolution" msgstr "Rezoliucija" msgid "Audio Stream" msgstr "Audio srautas" msgid "Channel Mode" msgstr "Kanalo būsena" msgid "Sampling Frequency" msgstr "Parodomasis dažnis" msgid "AC-3 Stream" msgstr "AC-3 srautas" msgid "Bit Stream Mode" msgstr "Srauto būsena" msgid "Audio Coding Mode" msgstr "Audio kodavimas" msgid "Center Mix Level" msgstr "Centrinis mikserio lygis" msgid "Surround Mix Level" msgstr "Surround Mix lygis" msgid "Dolby Surround Mode" msgstr "Dolby Surround būklė" msgid "Low Frequency Effects" msgstr "Žemo dažnio efektai" msgid "Dialogue Normalization" msgstr "Dialogo normalizacija" msgid "basic" msgstr "Standartinis" msgid "transponder" msgstr "Siųstuvas" msgid "stream" msgstr "Srautas" msgid "Classic" msgstr "Klasikinis" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "Tamsiai mėlyna" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "Sidabro žalia" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Paslėpti pagrindinio meniu įrašus" msgid "Define whether the main menu entry is hidden." msgstr "Nustatyti pagrindinio meniu įrašų paslėpimą." msgid "Default display mode" msgstr "Numatytasis rodymo būdas" msgid "Define the default display mode at startup." msgstr "Nustatyti numatytąjį rodymo būdą paleidžiant." msgid "Define the used OSD skin." msgstr "Nustatyti naudojamą ekrano apvalkalą." msgid "Define the used OSD theme." msgstr "Nustatyti naudojamą ekrano temą." msgid "Position" msgstr "Pozicija" msgid "Define the position of OSD." msgstr "Nustatyti ekrano užsklandos poziciją." msgid "Downscale OSD size [%]" msgstr "Sumažinti ekrano užsklandos (OSD) dydį [%]" msgid "Define the downscale ratio for OSD size." msgstr "Nustatyti ekrano užsklandos (OSD) mažinimo santykį." msgid "Red limit [%]" msgstr "Raudonoji ribą [%]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "Nustatyti raudonos juostos ribą, kuri naudojama blogo signalo indikacijai." msgid "Green limit [%]" msgstr "Žalioji riba [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "Nustatyti žalios juostos ribą, kuri naudojama gero signalo indikacijai." msgid "OSD update interval [0.1s]" msgstr "Ekrano užsklandos atnaujinimo intervalas [0.1s]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "Nustatyti ekrano užsklandos atnaujinimo intervalą. Mažesnis intervalas labiau apkrauna centrinį procesorių (CPU)." msgid "Analyze stream" msgstr "Analizuoti srautą" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "Nurodyti ar DVB srautas turi būti analizuojamas bei jo kokybė išskaičiuojama." msgid "Calculation interval [0.1s]" msgstr "Apskaitos intervalos [0.1s]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "Nustatyti apskaitos intervalą. Kuo didesnis intervalas, tuo tikslesni duomenys." msgid "Use SVDRP service" msgstr "Naudoti SVDRP paslaugą" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "Nurodyti ar SVDRP paslauga naudojama kliento/serverio nustatymuose." msgid "SVDRP service port" msgstr "SVDRP įrenginio portas" msgid "Define the port number of SVDRP service." msgstr "Nustatyti SVDRP įrenginio prievadą." msgid "SVDRP service IP" msgstr "SVDRP įrenginio IP" msgid "Define the IP address of SVDRP service." msgstr "Nustatyti SVDRP įrenginio IP adresą." msgid "Help" msgstr "Pagalba" msgid "Fixed" msgstr "Sutvarkyta" msgid "Analog" msgstr "Analoginis" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 Layer I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 Layer II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 Layer III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 Layer I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 Layer II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 Layer III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "stereo" msgid "joint Stereo" msgstr "jungtinis stereo" msgid "dual" msgstr "dvigubas" msgid "mono" msgstr "mono" msgid "interlaced" msgstr "persipynęs (interlaced)" msgid "progressive" msgstr "progresyvinis" msgid "reserved" msgstr "rezervuota" msgid "extended" msgstr "išplėstas" msgid "unknown" msgstr "nežinomas" msgid "component" msgstr "komponentas" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Pilnai pagrindinis (CM)" msgid "Music and Effects (ME)" msgstr "Muzika ir efektai (ME)" msgid "Visually Impaired (VI)" msgstr "Skirta silpnaregiams (VI)" msgid "Hearing Impaired (HI)" msgstr "Skirta žmoniems su klausos negalia (HI)" msgid "Dialogue (D)" msgstr "Dialogas (D)" msgid "Commentary (C)" msgstr "Komentarai (C)" msgid "Emergency (E)" msgstr "Avarinis (E)" msgid "Voice Over (VO)" msgstr "Įgarsinta (VO)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "Kan1" msgid "Ch2" msgstr "Kan2" msgid "C" msgstr "C" msgid "L" msgstr "K" msgid "R" msgstr "D" msgid "S" msgstr "S" msgid "SL" msgstr "SL" msgid "SR" msgstr "SR" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "nerasta" msgid "MHz" msgstr "MHz" msgid "free" msgstr "nekoduota" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/po/fr_FR.po0000644000000000000000000001602012507745733013306 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Nicolas Huillard # Michaël Nival , 2010 # Bernard Jaulin , 2013 # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Bernard Jaulin \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "Moniteur sur le signal DVB" msgid "Signal Information" msgstr "Infos sur le signal DVB" msgid "Femon not available" msgstr "Femon n'est pas disponible" msgid "Video" msgstr "Vidéo" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Audio" msgid "Transponder Information" msgstr "Information du transpondeur" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Coderate" msgid "Protocol" msgstr "Protocole" msgid "Bitrate" msgstr "Taux d'échantillonnage fixe" msgid "Stream Information" msgstr "Information sur le flux" msgid "Video Stream" msgstr "Flux vidéo" msgid "Codec" msgstr "Codec" msgid "Aspect Ratio" msgstr "Format de l'image" msgid "Frame Rate" msgstr "Rafraîchissement" msgid "Video Format" msgstr "Standard vidéo" msgid "Resolution" msgstr "Résolution" msgid "Audio Stream" msgstr "Flux audio" msgid "Channel Mode" msgstr "Mode chaîne" msgid "Sampling Frequency" msgstr "Fréquence d'échantillonage" msgid "AC-3 Stream" msgstr "Flux AC-3" msgid "Bit Stream Mode" msgstr "Mode bitstream" msgid "Audio Coding Mode" msgstr "Mode de codage audio" msgid "Center Mix Level" msgstr "Niveau sonore milieu" msgid "Surround Mix Level" msgstr "Niveau sonore surround" msgid "Dolby Surround Mode" msgstr "Mode Dolby Surround" msgid "Low Frequency Effects" msgstr "Effets de basses" msgid "Dialogue Normalization" msgstr "Normalisation des dialogues" msgid "basic" msgstr "basique" msgid "transponder" msgstr "transpondeur" msgid "stream" msgstr "flux" msgid "Classic" msgstr "Classique" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "DeepBlue" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Duotone" msgid "SilverGreen" msgstr "SilverGreen" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Masquer dans le menu principal" msgid "Define whether the main menu entry is hidden." msgstr "Définit si l'entrée doit être masquée dans le menu principal." msgid "Default display mode" msgstr "Affichage par défaut" msgid "Define the default display mode at startup." msgstr "Définit l'affichage par défaut au démarrage." msgid "Define the used OSD skin." msgstr "Définit le skin OSD à utiliser." msgid "Define the used OSD theme." msgstr "Définit le thème OSD à utiliser." msgid "Position" msgstr "Position" msgid "Define the position of OSD." msgstr "Définit la position de l'OSD." msgid "Downscale OSD size [%]" msgstr "Réduit la taille de l'OSD (%)" msgid "Define the downscale ratio for OSD size." msgstr "Définit le ration de réduction de l'OSD." msgid "Red limit [%]" msgstr "Limite du rouge (%)" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "Définit la limite de la barre rouge, qui est utilisé pour indiquer un mauvais signal." msgid "Green limit [%]" msgstr "Limite du vert (%)" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "Définit la limite de la barre rouge, qui est utilisé pour indiquer un bon signal." msgid "OSD update interval [0.1s]" msgstr "Intervalle de mise à jour (0,1s)" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "Définit l'intervalle de mise à jour de l'OSD. Un petit intervalle génère une charge CPU plus importante." msgid "Analyze stream" msgstr "Analyser le flux" msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "Définit si le flux DVB est analysé et le taux d'échantillonnage fixe calculé." msgid "Calculation interval [0.1s]" msgstr "Intervalle de calcul (0,1s)" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "Définit l'intervalle de cacul. Un plus grand intervalle génère une valeur plus stable." msgid "Use SVDRP service" msgstr "Utiliser le service SVDRP" msgid "Define whether the SVDRP service is used in client/server setups." msgstr "Définit si le service SVDRP est utilisé dans la configuration client/serveur." msgid "SVDRP service port" msgstr "Port du service SVDRP" msgid "Define the port number of SVDRP service." msgstr "Définit le port d'écoute du service SVDRP." msgid "SVDRP service IP" msgstr "IP du service SVDRP" msgid "Define the IP address of SVDRP service." msgstr "Définit l'adresse IP du service SVDRP." msgid "Help" msgstr "Aide" msgid "Fixed" msgstr "Fixe" msgid "Analog" msgstr "Analogique" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 Layer I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 Layer II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 Layer III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 Layer I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 Layer II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 Layer III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "stéréo" msgid "joint Stereo" msgstr "joint Stereo" msgid "dual" msgstr "double" msgid "mono" msgstr "mono" msgid "interlaced" msgstr "entrelacé" msgid "progressive" msgstr "progressif" msgid "reserved" msgstr "réservé" msgid "extended" msgstr "étendu" msgid "unknown" msgstr "inconnu" msgid "component" msgstr "composant" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Principal (CM)" msgid "Music and Effects (ME)" msgstr "Musique et effets (ME)" msgid "Visually Impaired (VI)" msgstr "Malvoyants (VI)" msgid "Hearing Impaired (HI)" msgstr "Malentendants (HI)" msgid "Dialogue (D)" msgstr "Dialogue (D)" msgid "Commentary (C)" msgstr "Commentaires (C)" msgid "Emergency (E)" msgstr "Urgence (E)" msgid "Voice Over (VO)" msgstr "Voix off (VO)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "Can. 1" msgid "Ch2" msgstr "Can. 2" msgid "C" msgstr "Centre" msgid "L" msgstr "Gauche" msgid "R" msgstr "Droite" msgid "S" msgstr "Surround" msgid "SL" msgstr "Surround gauche" msgid "SR" msgstr "Surround droit" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "non indiqué" msgid "MHz" msgstr "MHz" msgid "free" msgstr "libre" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/po/hu_HU.po0000644000000000000000000001616112507745733013326 0ustar rootroot# VDR plugin language source file. # Copyright (C) 2007-2015 Rolf Ahrenberg # This file is distributed under the same license as the femon package. # Fley Istvn , 2011 # msgid "" msgstr "" "Project-Id-Version: vdr-femon 2.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-04 04:04+0300\n" "PO-Revision-Date: 2015-04-04 04:04+0300\n" "Last-Translator: Fley Istvn \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Hungarian\n" "X-Poedit-Country: HUNGARY\n" "X-Poedit-SourceCharset: iso-8859-2\n" msgid "DVB Signal Information Monitor (OSD)" msgstr "DVB jelszint monitor (OSD)" msgid "Signal Information" msgstr "Jel informci" msgid "Femon not available" msgstr "Femon nem elrhet" msgid "Video" msgstr "Video" msgid "AC-3" msgstr "AC-3" msgid "Audio" msgstr "Audio" msgid "Transponder Information" msgstr "Transponder inf" msgid "Apid" msgstr "Apid" msgid "Dpid" msgstr "Dpid" msgid "Spid" msgstr "Spid" msgid "Nid" msgstr "Nid" msgid "Tid" msgstr "Tid" msgid "Rid" msgstr "Rid" msgid "Coderate" msgstr "Coderate" msgid "Protocol" msgstr "" msgid "Bitrate" msgstr "Bitrta" msgid "Stream Information" msgstr "Adatfolyam inf" msgid "Video Stream" msgstr "Vide adatfolyam" msgid "Codec" msgstr "Kodek" msgid "Aspect Ratio" msgstr "Mretarny" msgid "Frame Rate" msgstr "Kpfrissts" msgid "Video Format" msgstr "Vide formtum" msgid "Resolution" msgstr "Felbonts" msgid "Audio Stream" msgstr "Hang adatfolyam" msgid "Channel Mode" msgstr "Hangsv md" msgid "Sampling Frequency" msgstr "Mintavtelezsi frekvencia" msgid "AC-3 Stream" msgstr "AC-3 adatfolyam" msgid "Bit Stream Mode" msgstr "Bit Stream md" msgid "Audio Coding Mode" msgstr "Hang kdolsi md" msgid "Center Mix Level" msgstr "Kzpcsatorna keversi jelszintje" msgid "Surround Mix Level" msgstr "Trhats csatorna keversi szintje" msgid "Dolby Surround Mode" msgstr "Dolby Surround md" msgid "Low Frequency Effects" msgstr "LFE - alacsony frekvencis effektek" msgid "Dialogue Normalization" msgstr "Prbeszd jelszint normalizlsa" msgid "basic" msgstr "alap" msgid "transponder" msgstr "transponder" msgid "stream" msgstr "adatfolyam (stream)" msgid "Classic" msgstr "Klasszikus" msgid "Elchi" msgstr "Elchi" msgid "ST:TNG" msgstr "ST:TNG" msgid "DeepBlue" msgstr "Sttkk" msgid "Moronimo" msgstr "Moronimo" msgid "Enigma" msgstr "Enigma" msgid "EgalsTry" msgstr "EgalsTry" msgid "Duotone" msgstr "Ktszn (duotone)" msgid "SilverGreen" msgstr "Ezst-zld" msgid "PearlHD" msgstr "PearlHD" msgid "Hide main menu entry" msgstr "Menbejegyzs elrejtse" msgid "Define whether the main menu entry is hidden." msgstr "Meghatrozza, hogy megjelenjen-e a fmenben." msgid "Default display mode" msgstr "Alaprtelmezett megjelentsi md" msgid "Define the default display mode at startup." msgstr "Bekapcsolskor melyik megjelentsi mddal induljon." msgid "Define the used OSD skin." msgstr "Az OSD br kivlasztsa." msgid "Define the used OSD theme." msgstr "Az OSD tma kivlasztsa." msgid "Position" msgstr "Elhelyezs" msgid "Define the position of OSD." msgstr "A kpernyelhelyezs kivlasztsa" msgid "Downscale OSD size [%]" msgstr "Az OSD lemretezse [%]" msgid "Define the downscale ratio for OSD size." msgstr "Az OSD mretnek lemretezse szzalkban." msgid "Red limit [%]" msgstr "Piros sznt hatra [%]" msgid "Define a limit for red bar, which is used to indicate a bad signal." msgstr "A piros sv hatrnak belltsa, ezt hasznljuk a nem elgsges jelszint kijelzshez." msgid "Green limit [%]" msgstr "Zld sznt hatra [%]" msgid "Define a limit for green bar, which is used to indicate a good signal." msgstr "A zld sv hatrnak belltsa, ezt hasznljuk az elgsges jelszint kijelzshez." msgid "OSD update interval [0.1s]" msgstr "OSD frisstsnek gyakorisga [0.1mp]" msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." msgstr "Meghatrozza, hogy milyen gyakran legyen frisstve az OSD. Kisebb intervallum nagyobb CPU terhelst eredmnyez." msgid "Analyze stream" msgstr "Adatfolyam (stream) elemzse." msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgstr "Meghatrozza, hogy a DVB adatfolyam elemzsre kerljn-e, s szmoldjon-e bitrta." msgid "Calculation interval [0.1s]" msgstr "Szmts gyakorisga [0.1mp]" msgid "Define an interval for calculation. The bigger interval generates more stable values." msgstr "Meghatrozza, hogy milyen gyakran trtnjen szmts. Nagyobb intervallum pontosabb rtkeket eredmnyez." msgid "Use SVDRP service" msgstr "SVDRP szolgltats hasznlata." msgid "Define whether the SVDRP service is used in client/server setups." msgstr "Ki-bekapcsolja az SVDRP szolgltatst, amely kliens-szerver krnyezetben hasznlatos." msgid "SVDRP service port" msgstr "Az SVDRP szolgltats portja" msgid "Define the port number of SVDRP service." msgstr "Meghatrozza, hogy melyik porton fut az SVDRP." msgid "SVDRP service IP" msgstr "Az SVDRP szolgltats IP-je" msgid "Define the IP address of SVDRP service." msgstr "Meghatrozza, hogy milyen IP cmen fut az SVDRP szolgltats." msgid "Help" msgstr "Segtsg" msgid "Fixed" msgstr "lland" msgid "Analog" msgstr "analog" msgid "MPEG-2" msgstr "MPEG-2" msgid "H.264" msgstr "H.264" msgid "MPEG-1 Layer I" msgstr "MPEG-1 Layer I" msgid "MPEG-1 Layer II" msgstr "MPEG-1 Layer II" msgid "MPEG-1 Layer III" msgstr "MPEG-1 Layer III" msgid "MPEG-2 Layer I" msgstr "MPEG-2 Layer I" msgid "MPEG-2 Layer II" msgstr "MPEG-2 Layer II" msgid "MPEG-2 Layer III" msgstr "MPEG-2 Layer III" msgid "HE-AAC" msgstr "HE-AAC" msgid "LATM" msgstr "LATM" msgid "stereo" msgstr "sztere" msgid "joint Stereo" msgstr "joint sztere" msgid "dual" msgstr "dul" msgid "mono" msgstr "mon" msgid "interlaced" msgstr "vltottsvos" msgid "progressive" msgstr "progresszv" msgid "reserved" msgstr "fenntartott" msgid "extended" msgstr "kiterjesztett" msgid "unknown" msgstr "ismeretlen" msgid "component" msgstr "komponens" msgid "PAL" msgstr "PAL" msgid "NTSC" msgstr "NTSC" msgid "SECAM" msgstr "SECAM" msgid "MAC" msgstr "MAC" msgid "Hz" msgstr "Hz" msgid "Complete Main (CM)" msgstr "Mestercsatorna (CM)" msgid "Music and Effects (ME)" msgstr "Zene s effektek (ME)" msgid "Visually Impaired (VI)" msgstr "Ltskrosultak (VI)" msgid "Hearing Impaired (HI)" msgstr "Hallskrosultak (HI)" msgid "Dialogue (D)" msgstr "Prbeszd (D)" msgid "Commentary (C)" msgstr "Narrci (C)" msgid "Emergency (E)" msgstr "Srgssgi (E)" msgid "Voice Over (VO)" msgstr "Rbeszls (VO)" msgid "Karaoke" msgstr "Karaoke" msgid "Ch1" msgstr "Ch1" msgid "Ch2" msgstr "Ch2" msgid "C" msgstr "K" msgid "L" msgstr "B" msgid "R" msgstr "J" msgid "S" msgstr "S" msgid "SL" msgstr "BS" msgid "SR" msgstr "JS" msgid "dB" msgstr "dB" msgid "not indicated" msgstr "nincs feltntetve" msgid "MHz" msgstr "MHz" msgid "free" msgstr "szabad" msgid "Mbit/s" msgstr "Mbit/s" msgid "kbit/s" msgstr "kbit/s" femon-2.2.1/aac.h0000644000000000000000000000073212507636100012215 0ustar rootroot/* * aac.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_AAC_H #define __FEMON_AAC_H #include "audio.h" class cFemonAAC { private: cFemonAudioIf *audioHandlerM; static int sampleRateS[16]; public: cFemonAAC(cFemonAudioIf *audioHandlerP); virtual ~cFemonAAC(); bool processAudio(const uint8_t *bufP, int lenP); }; #endif //__FEMON_AAC_H femon-2.2.1/latm.c0000644000000000000000000000571412507636100012426 0ustar rootroot/* * latm.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "tools.h" #include "latm.h" int cFemonLATM::bitrateS[3][16] = { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, // MPEG-2 Layer I {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, // MPEG-2 Layer II/III {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1} // MPEG-2 Layer II/III }; int cFemonLATM::sampleRateS[4] = { 22050, 24000, 16000, -1 }; cFemonLATM::cFemonLATM(cFemonAudioIf *audioHandlerP) : audioHandlerM(audioHandlerP) { } cFemonLATM::~cFemonLATM() { } bool cFemonLATM::processAudio(const uint8_t *bufP, int lenP) { cFemonBitStream bs(bufP, lenP * 8); if (!audioHandlerM) return false; // skip PES header if (!PesLongEnough(lenP)) return false; bs.SkipBits(8 * PesPayloadOffset(bufP)); // MPEG audio detection if (bs.GetBits(12) != 0x56E) // syncword return false; audioHandlerM->SetAudioCodec(AUDIO_CODEC_LATM); if (bs.GetBit() == 0) // id: MPEG-1=1, extension to lower sampling frequencies=0 return true; // @todo: lower sampling frequencies support int layer = 3 - bs.GetBits(2); // layer: I=11, II=10, III=01 bs.SkipBit(); // protection bit int bit_rate_index = bs.GetBits(4); // bitrate index int sampling_frequency = bs.GetBits(2); // sampling frequency bs.SkipBit(); // padding bit bs.SkipBit(); // private pid int mode = bs.GetBits(2); // mode switch (mode) { case 0: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO); break; case 1: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO); break; case 2: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL); break; case 3: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE); break; default: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID); break; } if (layer == 3) { audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE); } else { switch (bit_rate_index) { case 0: audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE); break; case 0xF: audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED); break; default: audioHandlerM->SetAudioBitrate(1000 * bitrateS[layer][bit_rate_index]); break; } } switch (sampling_frequency) { case 3: audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED); break; default: audioHandlerM->SetAudioSamplingFrequency(sampleRateS[sampling_frequency]); break; } return true; } femon-2.2.1/svdrpservice.h0000644000000000000000000000144112507636100014206 0ustar rootroot/* * svdrpservice.h: Public interface of the plugin's services * * See the README file for copyright information and how to reach the author. */ #ifndef _SVDRPSERVICE__H #define _SVDRPSERVICE__H #include class cLine: public cListObject { private: char *lineM; public: const char *Text() { return lineM; } cLine(const char *strP) { lineM = strP ? strdup(strP) : NULL; }; virtual ~cLine() { if (lineM) free(lineM); }; }; struct SvdrpConnection_v1_0 { // in cString serverIp; unsigned short serverPort; bool shared; // in+out int handle; }; struct SvdrpCommand_v1_0 { // in cString command; int handle; // out cList reply; unsigned short responseCode; }; #endif //_SVDRPSERVICE__H femon-2.2.1/setup.h0000644000000000000000000000160212507636100012626 0ustar rootroot/* * setup.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_SETUP_H #define __FEMON_SETUP_H class cMenuFemonSetup : public cMenuSetupPage { private: const char *dispModesM[eFemonModeMaxNumber]; const char *skinsM[eFemonSkinMaxNumber]; const char *themesM[eFemonThemeMaxNumber]; cVector helpM; int hideMenuM; int displayModeM; int skinM; int themeM; int positionM; int downscaleM; int redLimitM; int greenLimitM; int updateIntervalM; int analyzeStreamM; int calcIntervalM; int useSvdrpM; int svdrpPortM; char svdrpIpM[MaxSvdrpIp + 1]; // must end with additional null void Setup(void); protected: virtual eOSState ProcessKey(eKeys Key); virtual void Store(void); public: cMenuFemonSetup(); }; #endif // __FEMON_SETUP_H femon-2.2.1/tools.c0000644000000000000000000005636012507636100012634 0ustar rootroot/* * tools.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif #include #include #include #include #include #include #include "osd.h" #include "receiver.h" #include "tools.h" static cString getCA(int valueP) { // http://www.dvb.org/index.php?id=174 // http://en.wikipedia.org/wiki/Conditional_access_system switch (valueP) { case 0x0000: return cString::sprintf("%s (%X)", trVDR("Free To Air"), valueP); // Reserved case 0x0001 ... 0x009F: case 0x00A2 ... 0x00FF: return cString::sprintf("%s (%X)", tr("Fixed"), valueP); // Standardized systems case 0x00A0 ... 0x00A1: return cString::sprintf("%s (%X)", tr("Analog"), valueP); // Analog signals case 0x0100 ... 0x01FF: return cString::sprintf("SECA Mediaguard (%X)", valueP); // Canal Plus case 0x0464: return cString::sprintf("EuroDec (%X)", valueP); // EuroDec case 0x0500 ... 0x05FF: return cString::sprintf("Viaccess (%X)", valueP); // France Telecom case 0x0600 ... 0x06FF: return cString::sprintf("Irdeto (%X)", valueP); // Irdeto case 0x0700 ... 0x07FF: return cString::sprintf("DigiCipher 2 (%X)", valueP); // Jerrold/GI/Motorola 4DTV case 0x0900 ... 0x09FF: return cString::sprintf("NDS Videoguard (%X)", valueP); // NDS case 0x0B00 ... 0x0BFF: return cString::sprintf("Conax (%X)", valueP); // Norwegian Telekom case 0x0D00 ... 0x0DFF: return cString::sprintf("CryptoWorks (%X)", valueP); // Philips CryptoTec case 0x0E00 ... 0x0EFF: return cString::sprintf("PowerVu (%X)", valueP); // Scientific Atlanta case 0x1000: return cString::sprintf("RAS (%X)", valueP); // Tandberg Television case 0x1200 ... 0x12FF: return cString::sprintf("NagraVision (%X)", valueP); // BellVu Express case 0x1700 ... 0x17FF: return cString::sprintf("VCAS (%X)", valueP); // Verimatrix Inc. former BetaTechnik case 0x1800 ... 0x18FF: return cString::sprintf("NagraVision (%X)", valueP); // Kudelski SA case 0x22F0: return cString::sprintf("Codicrypt (%X)", valueP); // Scopus Network Technologies case 0x2600: return cString::sprintf("BISS (%X)", valueP); // European Broadcasting Union case 0x2719: return cString::sprintf("VanyaCas (%X)", valueP); // S-Curious Research & Technology Pvt. Ltd. case 0x4347: return cString::sprintf("CryptOn (%X)", valueP); // CryptOn case 0x4800: return cString::sprintf("Accessgate (%X)", valueP); // Telemann case 0x4900: return cString::sprintf("China Crypt (%X)", valueP); // CryptoWorks case 0x4A02: return cString::sprintf("Tongfang (%X)", valueP); // Tsinghua Tongfang Company case 0x4A10: return cString::sprintf("EasyCas (%X)", valueP); // EasyCas case 0x4A20: return cString::sprintf("AlphaCrypt (%X)", valueP); // AlphaCrypt case 0x4A60: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky case 0x4A61: return cString::sprintf("Neotioncrypt (%X)", valueP); // Neotion case 0x4A62: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky case 0x4A63: return cString::sprintf("Neotion SHL (%X)", valueP); // Neotion case 0x4A64 ... 0x4A6F: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky case 0x4A70: return cString::sprintf("DreamCrypt (%X)", valueP); // Dream Multimedia case 0x4A80: return cString::sprintf("ThalesCrypt (%X)", valueP); // Thales Broadcast & Multimedia case 0x4AA1: return cString::sprintf("KeyFly (%X)", valueP); // SIDSA case 0x4ABF: return cString::sprintf("CTI-CAS (%X)", valueP); // Beijing Compunicate Technology Inc. case 0x4AC1: return cString::sprintf("Latens (%X)", valueP); // Latens Systems case 0x4AD0 ... 0x4AD1: return cString::sprintf("X-Crypt (%X)", valueP); // XCrypt Inc. case 0x4AD4: return cString::sprintf("OmniCrypt (%X)", valueP); // Widevine Technologies, Inc. case 0x4AE0 ... 0x4AE1: return cString::sprintf("Z-Crypt (%X)", valueP); // Digi Raum Electronics Co. Ltd. case 0x4AE4: return cString::sprintf("CoreCrypt (%X)", valueP); // CoreTrust case 0x4AE5: return cString::sprintf("PRO-Crypt (%X)", valueP); // IK SATPROF case 0x4AEA: return cString::sprintf("Cryptoguard (%X)", valueP); // Gryptoguard AB case 0x4AEB: return cString::sprintf("Abel Quintic (%X)", valueP); // Abel DRM Systems case 0x4AF0: return cString::sprintf("ABV (%X)", valueP); // Alliance Broadcast Vision case 0x5500: return cString::sprintf("Z-Crypt (%X)", valueP); // Digi Raum Electronics Co. Ltd. case 0x5501: return cString::sprintf("Griffin (%X)", valueP); // Nucleus Systems Ltd. case 0x5581: return cString::sprintf("Bulcrypt (%X)", valueP); // Bulcrypt case 0x7BE1: return cString::sprintf("DRE-Crypt (%X)", valueP); // DRE-Crypt case 0xA101: return cString::sprintf("RosCrypt-M (%X)", valueP); // NIIR case 0xEAD0: return cString::sprintf("VanyaCas (%X)", valueP); // S-Curious Research & Technology Pvt. Ltd. default: break; } return cString::sprintf("%X", valueP); } static const char *getUserString(int valueP, const tDvbParameterMap *mapP) { const tDvbParameterMap *map = mapP; while (map && map->userValue != -1) { if (map->driverValue == valueP) return map->userString ? trVDR(map->userString) : "---"; map++; } return "---"; } cDvbDevice *getDvbDevice(cDevice* deviceP) { cDvbDevice *dev = dynamic_cast(deviceP); #ifdef __DYNAMIC_DEVICE_PROBE if (!dev && deviceP && deviceP->HasSubDevice()) dev = dynamic_cast(deviceP->SubDevice()); #endif return dev; } cString getFrontendInfo(cDvbDevice *deviceP) { struct dvb_frontend_info value; fe_status_t status; cString info = ""; uint16_t signal = 0; uint16_t snr = 0; uint32_t ber = 0; uint32_t unc = 0; cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (!deviceP) return info; int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); if (fe < 0) return info; info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality()); if (ioctl(fe, FE_GET_INFO, &value) >= 0) info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *deviceP->DeviceName()); if (ioctl(fe, FE_READ_STATUS, &status) >= 0) info = cString::sprintf("%s\nSTAT:%02X", *info, status); if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0) info = cString::sprintf("%s\nSGNL:%04X", *info, signal); if (ioctl(fe, FE_READ_SNR, &snr) >= 0) info = cString::sprintf("%s\nSNRA:%04X", *info, snr); if (ioctl(fe, FE_READ_BER, &ber) >= 0) info = cString::sprintf("%s\nBERA:%08X", *info, ber); if (ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc) >= 0) info = cString::sprintf("%s\nUNCB:%08X", *info, unc); close(fe); if (cFemonOsd::Instance()) info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate()); if (channel) info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText()); return info; } cString getFrontendName(cDvbDevice *deviceP) { if (!deviceP) return NULL; return (cString::sprintf("%s on deviceP #%d", *deviceP->DeviceName(), deviceP->CardIndex())); } cString getFrontendStatus(cDvbDevice *deviceP) { fe_status_t value; if (!deviceP) return NULL; int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); if (fe < 0) return NULL; memset(&value, 0, sizeof(value)); ioctl(fe, FE_READ_STATUS, &value); close(fe); return (cString::sprintf("Status %s:%s:%s:%s:%s on deviceP #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", deviceP->CardIndex())); } uint16_t getSignal(cDvbDevice *deviceP) { uint16_t value = 0; if (!deviceP) return (value); int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); if (fe < 0) return (value); ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value); close(fe); return (value); } uint16_t getSNR(cDvbDevice *deviceP) { uint16_t value = 0; if (!deviceP) return (value); int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); if (fe < 0) return (value); ioctl(fe, FE_READ_SNR, &value); close(fe); return (value); } uint32_t getBER(cDvbDevice *deviceP) { uint32_t value = 0; if (!deviceP) return (value); int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); if (fe < 0) return (value); ioctl(fe, FE_READ_BER, &value); close(fe); return (value); } uint32_t getUNC(cDvbDevice *deviceP) { uint32_t value = 0; if (!deviceP) return (value); int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); if (fe < 0) return (value); ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value); close(fe); return (value); } cString getApids(const cChannel *channelP) { int value = 0; cString apids = cString::sprintf("%d", channelP->Apid(value)); while (channelP->Apid(++value) && (value < MAXAPIDS)) apids = cString::sprintf("%s, %d", *apids, channelP->Apid(value)); return apids; } cString getDpids(const cChannel *channelP) { int value = 0; cString dpids = cString::sprintf("%d", channelP->Dpid(value)); while (channelP->Dpid(++value) && (value < MAXDPIDS)) dpids = cString::sprintf("%s, %d", *dpids, channelP->Dpid(value)); return dpids; } cString getSpids(const cChannel *channelP) { int value = 0; cString spids = cString::sprintf("%d", channelP->Spid(value)); while (channelP->Spid(++value) && (value < MAXSPIDS)) spids = cString::sprintf("%s, %d", *spids, channelP->Spid(value)); return spids; } cString getCAids(const cChannel *channelP) { int value = 0; cString caids = cString::sprintf("%s", *getCA(channelP->Ca(value))); while (channelP->Ca(++value) && (value < MAXCAIDS)) caids = cString::sprintf("%s, %s", *caids, *getCA(channelP->Ca(value))); return caids; } cString getVideoStream(int value) { if (value != 0) return cString::sprintf("#%d", value); return cString::sprintf("---"); } cString getAudioStream(int valueP, const cChannel *channelP) { int pid = 0; if (IS_AUDIO_TRACK(valueP)) pid = int(valueP - ttAudioFirst); if (channelP && channelP->Apid(pid)) { if (channelP->Alang(pid)) return cString::sprintf("#%d (%s)", channelP->Apid(pid), channelP->Alang(pid)); else return cString::sprintf("#%d", channelP->Apid(pid)); } return cString::sprintf("---"); } cString getAC3Stream(int valueP, const cChannel *channelP) { int pid = 0; if (IS_DOLBY_TRACK(valueP)) pid = int(valueP - ttDolbyFirst); if (channelP && channelP->Dpid(pid)) { if (channelP->Dlang(pid)) return cString::sprintf("#%d (%s)", channelP->Dpid(pid), channelP->Dlang(pid)); else return cString::sprintf("#%d", channelP->Dpid(pid)); } return cString::sprintf("---"); } cString getVideoCodec(int valueP) { switch (valueP) { case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2")); case VIDEO_CODEC_H264: return cString::sprintf("%s", tr("H.264")); default: break; } return cString::sprintf("---"); } cString getAudioCodec(int valueP) { switch (valueP) { case AUDIO_CODEC_MPEG1_I: return cString::sprintf("%s", tr("MPEG-1 Layer I")); case AUDIO_CODEC_MPEG1_II: return cString::sprintf("%s", tr("MPEG-1 Layer II")); case AUDIO_CODEC_MPEG1_III: return cString::sprintf("%s", tr("MPEG-1 Layer III")); case AUDIO_CODEC_MPEG2_I: return cString::sprintf("%s", tr("MPEG-2 Layer I")); case AUDIO_CODEC_MPEG2_II: return cString::sprintf("%s", tr("MPEG-2 Layer II")); case AUDIO_CODEC_MPEG2_III: return cString::sprintf("%s", tr("MPEG-2 Layer III")); case AUDIO_CODEC_HEAAC: return cString::sprintf("%s", tr("HE-AAC")); case AUDIO_CODEC_LATM: return cString::sprintf("%s", tr("LATM")); default: break; } return cString::sprintf("---"); } cString getAudioChannelMode(int valueP) { switch (valueP) { case AUDIO_CHANNEL_MODE_STEREO: return cString::sprintf("%s", tr("stereo")); case AUDIO_CHANNEL_MODE_JOINT_STEREO: return cString::sprintf("%s", tr("joint Stereo")); case AUDIO_CHANNEL_MODE_DUAL: return cString::sprintf("%s", tr("dual")); case AUDIO_CHANNEL_MODE_SINGLE: return cString::sprintf("%s", tr("mono")); default: break; } return cString::sprintf("---"); } cString getCoderate(int valueP) { return cString::sprintf("%s", getUserString(valueP, CoderateValues)); } cString getTransmission(int valueP) { return cString::sprintf("%s", getUserString(valueP, TransmissionValues)); } cString getBandwidth(int valueP) { return cString::sprintf("%s", getUserString(valueP, BandwidthValues)); } cString getInversion(int valueP) { return cString::sprintf("%s", getUserString(valueP, InversionValues)); } cString getHierarchy(int valueP) { return cString::sprintf("%s", getUserString(valueP, HierarchyValues)); } cString getGuard(int valueP) { return cString::sprintf("%s", getUserString(valueP, GuardValues)); } cString getModulation(int valueP) { return cString::sprintf("%s", getUserString(valueP, ModulationValues)); } cString getTerrestrialSystem(int valueP) { return cString::sprintf("%s", getUserString(valueP, SystemValuesTerr)); } cString getSatelliteSystem(int valueP) { return cString::sprintf("%s", getUserString(valueP, SystemValuesSat)); } cString getRollOff(int valueP) { return cString::sprintf("%s", getUserString(valueP, RollOffValues)); } cString getPilot(int valueP) { return cString::sprintf("%s", getUserString(valueP, PilotValues)); } cString getResolution(int widthP, int heightP, int scanP) { if ((widthP > 0) && (heightP > 0)) { switch (scanP) { case VIDEO_SCAN_INTERLACED: return cString::sprintf("%dx%d %s", widthP, heightP, tr("interlaced")); case VIDEO_SCAN_PROGRESSIVE: return cString::sprintf("%dx%d %s", widthP, heightP, tr("progressive")); default: return cString::sprintf("%dx%d", widthP, heightP); } } return cString::sprintf("---"); } cString getAspectRatio(int valueP) { switch (valueP) { case VIDEO_ASPECT_RATIO_RESERVED: return cString::sprintf("%s", tr("reserved")); case VIDEO_ASPECT_RATIO_EXTENDED: return cString::sprintf("%s", tr("extended")); case VIDEO_ASPECT_RATIO_1_1: return cString::sprintf("1:1"); case VIDEO_ASPECT_RATIO_4_3: return cString::sprintf("4:3"); case VIDEO_ASPECT_RATIO_16_9: return cString::sprintf("16:9"); case VIDEO_ASPECT_RATIO_2_21_1: return cString::sprintf("2.21:1"); case VIDEO_ASPECT_RATIO_12_11: return cString::sprintf("12:11"); case VIDEO_ASPECT_RATIO_10_11: return cString::sprintf("10:11"); case VIDEO_ASPECT_RATIO_16_11: return cString::sprintf("16:11"); case VIDEO_ASPECT_RATIO_40_33: return cString::sprintf("40:33"); case VIDEO_ASPECT_RATIO_24_11: return cString::sprintf("24:11"); case VIDEO_ASPECT_RATIO_20_11: return cString::sprintf("20:11"); case VIDEO_ASPECT_RATIO_32_11: return cString::sprintf("32:11"); case VIDEO_ASPECT_RATIO_80_33: return cString::sprintf("80:33"); case VIDEO_ASPECT_RATIO_18_11: return cString::sprintf("18:11"); case VIDEO_ASPECT_RATIO_15_11: return cString::sprintf("15:11"); case VIDEO_ASPECT_RATIO_64_33: return cString::sprintf("64:33"); case VIDEO_ASPECT_RATIO_160_99: return cString::sprintf("160:99"); case VIDEO_ASPECT_RATIO_3_2: return cString::sprintf("3:2"); case VIDEO_ASPECT_RATIO_2_1: return cString::sprintf("2:1"); default: break; } return cString::sprintf("---"); } cString getVideoFormat(int valueP) { switch (valueP) { case VIDEO_FORMAT_UNKNOWN: return cString::sprintf("%s", tr("unknown")); case VIDEO_FORMAT_RESERVED: return cString::sprintf("%s", tr("reserved")); case VIDEO_FORMAT_COMPONENT: return cString::sprintf("%s", tr("component")); case VIDEO_FORMAT_PAL: return cString::sprintf("%s", tr("PAL")); case VIDEO_FORMAT_NTSC: return cString::sprintf("%s", tr("NTSC")); case VIDEO_FORMAT_SECAM: return cString::sprintf("%s", tr("SECAM")); case VIDEO_FORMAT_MAC: return cString::sprintf("%s", tr("MAC")); default: break; } return cString::sprintf("---"); } cString getFrameRate(double valueP) { if (valueP > 0) return cString::sprintf("%.2f %s", valueP, tr("Hz")); return cString::sprintf("---"); } cString getAC3BitStreamMode(int valueP, int codingP) { switch (valueP) { case AUDIO_BITSTREAM_MODE_CM: return cString::sprintf("%s", tr("Complete Main (CM)")); case AUDIO_BITSTREAM_MODE_ME: return cString::sprintf("%s", tr("Music and Effects (ME)")); case AUDIO_BITSTREAM_MODE_VI: return cString::sprintf("%s", tr("Visually Impaired (VI)")); case AUDIO_BITSTREAM_MODE_HI: return cString::sprintf("%s", tr("Hearing Impaired (HI)")); case AUDIO_BITSTREAM_MODE_D: return cString::sprintf("%s", tr("Dialogue (D)")); case AUDIO_BITSTREAM_MODE_C: return cString::sprintf("%s", tr("Commentary (C)")); case AUDIO_BITSTREAM_MODE_E: return cString::sprintf("%s", tr("Emergency (E)")); case AUDIO_BITSTREAM_MODE_VO_KAR: return cString::sprintf("%s", (codingP == 1) ? tr("Voice Over (VO)") : tr("Karaoke")); default: break; } return cString::sprintf("---"); } cString getAC3AudioCodingMode(int valueP, int streamP) { if (streamP != 7) { switch (valueP) { case AUDIO_CODING_MODE_1_1: return cString::sprintf("1+1 - %s, %s", tr("Ch1"), tr("Ch2")); case AUDIO_CODING_MODE_1_0: return cString::sprintf("1/0 - %s", tr("C")); case AUDIO_CODING_MODE_2_0: return cString::sprintf("2/0 - %s, %s", tr("L"), tr("R")); case AUDIO_CODING_MODE_3_0: return cString::sprintf("3/0 - %s, %s, %s", tr("L"), tr("C"), tr("R")); case AUDIO_CODING_MODE_2_1: return cString::sprintf("2/1 - %s, %s, %s", tr("L"), tr("R"), tr("S")); case AUDIO_CODING_MODE_3_1: return cString::sprintf("3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S")); case AUDIO_CODING_MODE_2_2: return cString::sprintf("2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR")); case AUDIO_CODING_MODE_3_2: return cString::sprintf("3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR")); default: break; } } return cString::sprintf("---"); } cString getAC3CenterMixLevel(int valueP) { switch (valueP) { case AUDIO_CENTER_MIX_LEVEL_MINUS_3dB: return cString::sprintf("-3.0 %s", tr("dB")); case AUDIO_CENTER_MIX_LEVEL_MINUS_4_5dB: return cString::sprintf("-4.5 %s", tr("dB")); case AUDIO_CENTER_MIX_LEVEL_MINUS_6dB: return cString::sprintf("-6.0 %s", tr("dB")); case AUDIO_CENTER_MIX_LEVEL_RESERVED: return cString::sprintf("%s", tr("reserved")); default: break; } return cString::sprintf("---"); } cString getAC3SurroundMixLevel(int valueP) { switch (valueP) { case AUDIO_SURROUND_MIX_LEVEL_MINUS_3dB: return cString::sprintf("-3 %s", tr("dB")); case AUDIO_SURROUND_MIX_LEVEL_MINUS_6dB: return cString::sprintf("-6 %s", tr("dB")); case AUDIO_SURROUND_MIX_LEVEL_0_dB: return cString::sprintf("0 %s", tr("dB")); case AUDIO_SURROUND_MIX_LEVEL_RESERVED: return cString::sprintf("%s", tr("reserved")); default: break; } return cString::sprintf("---"); } cString getAC3DolbySurroundMode(int valueP) { switch (valueP) { case AUDIO_DOLBY_SURROUND_MODE_NOT_INDICATED: return cString::sprintf("%s", tr("not indicated")); case AUDIO_DOLBY_SURROUND_MODE_NOT_DOLBYSURROUND: return cString::sprintf("%s", trVDR("no")); case AUDIO_DOLBY_SURROUND_MODE_DOLBYSURROUND: return cString::sprintf("%s", trVDR("yes")); case AUDIO_DOLBY_SURROUND_MODE_RESERVED: return cString::sprintf("%s", tr("reserved")); default: break; } return cString::sprintf("---"); } cString getAC3DialogLevel(int valueP) { if (valueP > 0) return cString::sprintf("-%d %s", valueP, tr("dB")); return cString::sprintf("---"); } cString getFrequencyMHz(int valueP) { double freq = valueP; while (freq > 20000.0) freq /= 1000.0; return cString::sprintf("%s %s", *dtoa(freq, "%lg"), tr("MHz")); } cString getAudioSamplingFreq(int valueP) { switch (valueP) { case AUDIO_SAMPLING_FREQUENCY_INVALID: return cString::sprintf("---"); case AUDIO_SAMPLING_FREQUENCY_RESERVED: return cString::sprintf("%s", tr("reserved")); default: break; } return cString::sprintf("%d %s", valueP, tr("Hz")); } cString getAudioBitrate(double valueP, double streamP) { switch ((int)streamP) { case AUDIO_BITRATE_INVALID: return cString::sprintf("---"); case AUDIO_BITRATE_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(valueP)); case AUDIO_BITRATE_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(valueP)); default: break; } return cString::sprintf("%s (%s)", *getBitrateKbits(streamP), *getBitrateKbits(valueP)); } cString getVideoBitrate(double valueP, double streamP) { return cString::sprintf("%s (%s)", *getBitrateMbits(streamP), *getBitrateMbits(valueP)); } cString getBitrateMbits(double valueP) { if (valueP > 0) return cString::sprintf("%.2f %s", valueP / 1000000.0, tr("Mbit/s")); return cString::sprintf("---"); } cString getBitrateKbits(double valueP) { if (valueP > 0) return cString::sprintf("%.0f %s", valueP / 1000.0, tr("kbit/s")); return cString::sprintf("---"); } // --- cFemonBitStream ------------------------------------------------------- uint32_t cFemonBitStream::GetUeGolomb() { int n = 0; while (!GetBit() && (n < 32)) n++; return (n ? ((1 << n) - 1) + GetBits(n) : 0); } int32_t cFemonBitStream::GetSeGolomb() { uint32_t r = GetUeGolomb() + 1; return ((r & 1) ? -(r >> 1) : (r >> 1)); } void cFemonBitStream::SkipGolomb() { int n = 0; while (!GetBit() && (n < 32)) n++; SkipBits(n); } femon-2.2.1/log.h0000644000000000000000000000476612507636100012265 0ustar rootroot/* * log.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_LOG_H #define __FEMON_LOG_H #include "config.h" #define error(x...) esyslog("FEMON-ERROR: " x) #define info(x...) isyslog("FEMON: " x) // 0x0001: Generic call stack #define debug1(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug1) ? dsyslog("FEMON1: " x) : void() ) // 0x0002: H.264 #define debug2(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug2) ? dsyslog("FEMON2: " x) : void() ) // 0x0004: TBD #define debug3(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug3) ? dsyslog("FEMON3: " x) : void() ) // 0x0008: TBD #define debug4(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug4) ? dsyslog("FEMON4: " x) : void() ) // 0x0010: TBD #define debug5(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug5) ? dsyslog("FEMON5: " x) : void() ) // 0x0020: TBD #define debug6(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug6) ? dsyslog("FEMON6: " x) : void() ) // 0x0040: TBD #define debug7(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug7) ? dsyslog("FEMON7: " x) : void() ) // 0x0080: TBD #define debug8(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug8) ? dsyslog("FEMON8: " x) : void() ) // 0x0100: TBD #define debug9(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug9) ? dsyslog("FEMON9: " x) : void() ) // 0x0200: TBD #define debug10(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug10) ? dsyslog("FEMON10: " x) : void() ) // 0x0400: TBD #define debug11(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug11) ? dsyslog("FEMON11: " x) : void() ) // 0x0800: TBD #define debug12(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug12) ? dsyslog("FEMON12: " x) : void() ) // 0x1000: TBD #define debug13(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug13) ? dsyslog("FEMON13: " x) : void() ) // 0x2000: TBD #define debug14(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug14) ? dsyslog("FEMON14: " x) : void() ) // 0x4000: TBD #define debug15(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug15) ? dsyslog("FEMON15: " x) : void() ) // 0x8000; Extra call stack #define debug16(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug16) ? dsyslog("FEMON16: " x) : void() ) #endif // __FEMON_LOG_H femon-2.2.1/config.h0000644000000000000000000000775312507636100012750 0ustar rootroot/* * config.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_CONFIG_H #define __FEMON_CONFIG_H #define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx enum eFemonModes { eFemonModeBasic, eFemonModeTransponder, eFemonModeStream, eFemonModeAC3, eFemonModeMaxNumber }; class cFemonConfig { private: unsigned int traceModeM; int hideMenuM; int displayModeM; int skinM; int themeM; int positionM; int downscaleM; int redLimitM; int greenLimitM; int updateIntervalM; int analyzeStreamM; int calcIntervalM; int useSvdrpM; int svdrpPortM; char svdrpIpM[MaxSvdrpIp + 1]; // must end with additional null public: enum eTraceMode { eTraceModeNormal = 0x0000, eTraceModeDebug1 = 0x0001, eTraceModeDebug2 = 0x0002, eTraceModeDebug3 = 0x0004, eTraceModeDebug4 = 0x0008, eTraceModeDebug5 = 0x0010, eTraceModeDebug6 = 0x0020, eTraceModeDebug7 = 0x0040, eTraceModeDebug8 = 0x0080, eTraceModeDebug9 = 0x0100, eTraceModeDebug10 = 0x0200, eTraceModeDebug11 = 0x0400, eTraceModeDebug12 = 0x0800, eTraceModeDebug13 = 0x1000, eTraceModeDebug14 = 0x2000, eTraceModeDebug15 = 0x4000, eTraceModeDebug16 = 0x8000, eTraceModeMask = 0xFFFF }; cFemonConfig(); unsigned int GetTraceMode(void) const { return traceModeM; } bool IsTraceMode(eTraceMode modeP) const { return (traceModeM & modeP); } int GetHideMenu(void) const { return hideMenuM; } int GetDisplayMode(void) const { return displayModeM; } int GetSkin(void) const { return skinM; } int GetTheme(void) const { return themeM; } int GetPosition(void) const { return positionM; } int GetDownscale(void) const { return downscaleM; } int GetRedLimit(void) const { return redLimitM; } int GetGreenLimit(void) const { return greenLimitM; } int GetUpdateInterval(void) const { return updateIntervalM; } int GetAnalyzeStream(void) const { return analyzeStreamM; } int GetCalcInterval(void) const { return calcIntervalM; } int GetUseSvdrp(void) const { return useSvdrpM; } int GetSvdrpPort(void) const { return svdrpPortM; } const char *GetSvdrpIp(void) const { return svdrpIpM; } void SetTraceMode(unsigned int modeP) { traceModeM = (modeP & eTraceModeMask); } void SetHideMenu(int hideMenuP) { hideMenuM = hideMenuP; } void SetDisplayMode(int displayModeP) { if (displayModeM < 0 || displayModeM >= eFemonModeMaxNumber) displayModeM = 0; else displayModeM = displayModeP; } void SetSkin(int skinP) { skinM = skinP; } void SetTheme(int themeP) { themeM = themeP; } void SetPosition(int positionP) { positionM = positionP; } void SetDownscale(int downscaleP) { downscaleM = downscaleP; } void SetRedLimit(int redLimitP) { redLimitM = redLimitP; } void SetGreenLimit(int greenLimitP) { greenLimitM = greenLimitP; } void SetUpdateInterval(int updateIntervalP) { updateIntervalM = updateIntervalP; } void SetAnalyzeStream(int analyzeStreamP) { analyzeStreamM = analyzeStreamP; } void SetCalcInterval(int calcIntervalP) { calcIntervalM = calcIntervalP; } void SetUseSvdrp(int useSvdrpP) { useSvdrpM = useSvdrpP; } void SetSvdrpPort(int svdrpPortP) { svdrpPortM = svdrpPortP; } void SetSvdrpIp(const char *strP); }; extern cFemonConfig FemonConfig; enum eFemonSkins { eFemonSkinClassic, eFemonSkinElchi, eFemonSkinMaxNumber }; enum eFemonThemes { eFemonThemeClassic, eFemonThemeElchi, eFemonThemeSTTNG, eFemonThemeDeepBlue, eFemonThemeMoronimo, eFemonThemeEnigma, eFemonThemeEgalsTry, eFemonThemeDuotone, eFemonThemeSilverGreen, eFemonThemePearlHD, eFemonThemeMaxNumber }; struct cFemonTheme { int bpp; unsigned int clrBackground; unsigned int clrTitleBackground; unsigned int clrTitleText; unsigned int clrActiveText; unsigned int clrInactiveText; unsigned int clrRed; unsigned int clrYellow; unsigned int clrGreen; }; extern const cFemonTheme FemonTheme[eFemonThemeMaxNumber]; #endif // __FEMON_CONFIG_H femon-2.2.1/osd.h0000644000000000000000000000513712507636100012262 0ustar rootroot/* * osd.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_OSD_H #define __FEMON_OSD_H #include #include #include #include #include #include #include #include #include #include #include "receiver.h" #include "svdrpservice.h" #define MAX_BM_NUMBER 8 class cFemonOsd : public cOsdObject, public cThread, public cStatus { private: enum eDeviceSourceType { DEVICESOURCE_DVBAPI = 0, DEVICESOURCE_IPTV, DEVICESOURCE_PVRINPUT, DEVICESOURCE_COUNT }; static cFemonOsd *pInstanceS; cOsd *osdM; cFemonReceiver *receiverM; int frontendM; int svdrpFrontendM; double svdrpVideoBitRateM; double svdrpAudioBitRateM; SvdrpConnection_v1_0 svdrpConnectionM; cPlugin *svdrpPluginM; int numberM; int oldNumberM; int qualityM; bool qualityValidM; int strengthM; bool strengthValidM; uint16_t snrM; bool snrValidM; uint16_t signalM; bool signalValidM; uint32_t berM; bool berValidM; uint32_t uncM; bool uncValidM; cString frontendNameM; fe_status_t frontendStatusM; bool frontendStatusValidM; dvb_frontend_info frontendInfoM; eDeviceSourceType deviceSourceM; int displayModeM; int osdWidthM; int osdHeightM; int osdLeftM; int osdTopM; cFont *fontM; cTimeMs inputTimeM; cCondWait sleepM; cMutex mutexM; void DrawStatusWindow(void); void DrawInfoWindow(void); bool SvdrpConnect(void); bool SvdrpTune(void); protected: cFemonOsd(); cFemonOsd(const cFemonOsd&); cFemonOsd& operator= (const cFemonOsd&); virtual void Action(void); virtual void ChannelSwitch(const cDevice *deviceP, int channelNumberP, bool liveViewP); virtual void SetAudioTrack(int indexP, const char * const *tracksP); public: static cFemonOsd *Instance(bool createP = false); ~cFemonOsd(); virtual void Show(void); virtual eOSState ProcessKey(eKeys keyP); bool DeviceSwitch(int directionP); double GetVideoBitrate(void); double GetAudioBitrate(void); double GetDolbyBitrate(void); }; #endif //__FEMON_OSD_H femon-2.2.1/ac3.h0000644000000000000000000000101412507636100012131 0ustar rootroot/* * ac3.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_AC3_H #define __FEMON_AC3_H #include "audio.h" class cFemonAC3 { private: cFemonAC3If *audioHandlerM; static int bitrateS[32]; static int frequencieS[4]; static int frameS[3][32]; public: cFemonAC3(cFemonAC3If *audioHandlerP); virtual ~cFemonAC3(); bool processAudio(const uint8_t *bufP, int lenP); }; #endif //__FEMON_AC3_H femon-2.2.1/symbols/0000755000000000000000000000000012507636100013006 5ustar rootrootfemon-2.2.1/symbols/format480i.xpm0000644000000000000000000000153012507636100015430 0ustar rootroot/* XPM */ static const char *const format480i_xpm[] = { "38 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++", "+....................................+", "+.........++....++++.....++++........+", "+........+++...++++++...++++++.......+", "+.......++++...++..++...++..++.......+", "+......++.++..++....++.++....++......+", "+.....++..++..++....++.++....++.++...+", "+.....++..++...++..++..++....++.++...+", "+....++...++....++++...++....++......+", "+...++....++....++++...++....++.++...+", "+...+++++++++..++..++..++....++.++...+", "+...+++++++++.++....++.++....++.++...+", "+.........++..++....++.++....++.++...+", "+.........++...++..++...++..++..++...+", "+.........++...++++++...++++++..++...+", "+.........++....++++.....++++...++...+", "+....................................+", "++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/format720p.xpm0000644000000000000000000000161612507636100015441 0ustar rootroot/* XPM */ static const char *const format720p_xpm[] = { "41 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++++++++++++", "+.......................................+", "+...++++++++...++++.....++++............+", "+...++++++++.+++++++...++++++...........+", "+...++....++.++....++..++..++...........+", "+.........++.......++.++....++..........+", "+.........++.......++.++....++..........+", "+.........++.......++.++....++.++++.....+", "+........++......+++..++....++.+++++....+", "+.......+++.....+++...++....++.++..++...+", "+.......++.....+++....++....++.++..++...+", "+.......++....+++.....++....++.+++++....+", "+......+++...+++......++....++.++++.....+", "+......++....++........++..++..++.......+", "+......++....++++++++..++++++..++.......+", "+......++....++++++++...++++...++.......+", "+.......................................+", "+++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/one.xpm0000644000000000000000000000066312507636100014322 0ustar rootroot/* XPM */ static const char *const one_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", ".......++.....+", "....+++++.....+", "....+++++.....+", ".......++.....+", ".......++.....+", ".......++.....+", ".......++.....+", ".......++.....+", ".......++.....+", ".......++.....+", ".......++.....+", ".......++.....+", ".......++.....+", ".......++.....+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/format1080i.xpm0000644000000000000000000000164112507636100015510 0ustar rootroot/* XPM */ static const char *const format1080i_xpm[] = { "42 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++", "+........................................+", "+......++...++++.....++++.....++++.......+", "+...+++++..++++++...++++++...++++++......+", "+...+++++..++..++...++..++...++..++......+", "+......++.++....++.++....++.++....++.....+", "+......++.++....++.++....++.++....++.++..+", "+......++.++....++..++..++..++....++.++..+", "+......++.++....++...++++...++....++.....+", "+......++.++....++...++++...++....++.++..+", "+......++.++....++..++..++..++....++.++..+", "+......++.++....++.++....++.++....++.++..+", "+......++.++....++.++....++.++....++.++..+", "+......++..++..++...++..++...++..++..++..+", "+......++..++++++...++++++...++++++..++..+", "+......++...++++.....++++.....++++...++..+", "+........................................+", "++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/svdrp.xpm0000644000000000000000000000233712507636100014677 0ustar rootroot/* XPM */ static const char *const svdrp_xpm[] = { "60 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "+..........................................................+", "+.....+++++....++....++...++++++.....++++++.....++++++.....+", "+....+++++++...++....++...+++++++....+++++++....+++++++....+", "+...+++...++...++....++...++...+++...++...+++...++...+++...+", "+...++....++...++....++...++....++...++....++...++....++...+", "+...++.........++....++...++....++...++....++...++....++...+", "+...+++.........++..++....++....++...++...+++...++...+++...+", "+....+++++......++..++....++....++...+++++++....+++++++....+", "+.....+++++.....++..++....++....++...++++++.....++++++.....+", "+........+++....++..++....++....++...++...++....++.........+", "+.........++.....++++.....++....++...++...++....++.........+", "+...++....++.....++++.....++....++...++...++....++.........+", "+...++...+++......++......++...+++...++....++...++.........+", "+...+++++++.......++......+++++++....++....++...++.........+", "+....+++++........++......++++++.....++....++...++.........+", "+..........................................................+", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/encrypted.xpm0000644000000000000000000000111112507636100015523 0ustar rootroot/* XPM */ static const char *const encrypted_xpm[] = { "23 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++", "+.....................+", "+.....................+", "+.....................+", "+..............+++....+", "+.............+++++...+", "+............+++.+++..+", "+............++...++..+", "+..++++++++++++...++..+", "+..++++++++++++...++..+", "+...++.++....++...++..+", "+...++.++....+++.+++..+", "+...++.++.....+++++...+", "+..............+++....+", "+.....................+", "+.....................+", "+.....................+", "+++++++++++++++++++++++"}; femon-2.2.1/symbols/six.xpm0000644000000000000000000000066312507636100014344 0ustar rootroot/* XPM */ static const char *const six_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", "....++++++....+", "...++++++++...+", "...+++...++...+", "...++.........+", "...++.........+", "...++.+++.....+", "...+++++++....+", "...+++..+++...+", "...++....++...+", "...++....++...+", "...++....++...+", "...+++..+++...+", "...+++++++....+", "....+++++.....+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/format576.xpm0000644000000000000000000000137512507636100015274 0ustar rootroot/* XPM */ static const char *const format576_xpm[] = { "33 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++++", "+...............................+", "+...+++++++.++++++++..++++++....+", "+...+++++++.++++++++.++++++++...+", "+...++......++....++.+++...++...+", "+...++............++.++.........+", "+...++...........+++.++.........+", "+...++++++.......++..++.+++.....+", "+...+++++++......++..+++++++....+", "+...++...+++....+++..+++..+++...+", "+.........++....++...++....++...+", "+.........++....++...++....++...+", "+...++....++...+++...++....++...+", "+...++...+++...++....+++..+++...+", "+...+++++++....++....+++++++....+", "+....+++++.....++.....+++++.....+", "+...............................+", "+++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/ntsc.xpm0000644000000000000000000000077412507636100014513 0ustar rootroot/* XPM */ static const char *const ntsc_xpm[] = { "19 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++", "+.................+", "+...++.......++...+", "+...+++......++...+", "+...++++.....++...+", "+...++++.....++...+", "+...++.++....++...+", "+...++..++...++...+", "+...++..++...++...+", "+...++...++..++...+", "+...++...++..++...+", "+...++....++.++...+", "+...++.....++++...+", "+...++.....++++...+", "+...++......+++...+", "+...++.......++...+", "+.................+", "+++++++++++++++++++"}; femon-2.2.1/symbols/dolbydigital.xpm0000644000000000000000000000133412507636100016204 0ustar rootroot/* XPM */ static const char *const dolbydigital_xpm[] = { "31 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++", "+.............................+", "+...+++++++++++.+++++++++++...+", "+...++.++++++++.++++++++.++...+", "+...++...++++++.++++++...++...+", "+...++.....++++.++++.....++...+", "+...++......+++.+++......++...+", "+...++.......++.++.......++...+", "+...++.......++.++.......++...+", "+...++.......++.++.......++...+", "+...++.......++.++.......++...+", "+...++......+++.+++......++...+", "+...++.....++++.++++.....++...+", "+...++...++++++.++++++...++...+", "+...++.++++++++.++++++++.++...+", "+...+++++++++++.+++++++++++...+", "+.............................+", "+++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/device.xpm0000644000000000000000000000064412507636100014777 0ustar rootroot/* XPM */ static const char *const device_xpm[] = { "14 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++", "+.............", "+.......+..+..", "+.......+..+..", "+.......+..+..", "+....+++++++++", "+....+++++++++", "+......+..+...", "+......+..+...", "+......+..+...", "+......+..+...", "+...+++++++++.", "+...+++++++++.", "+.....+..+....", "+.....+..+....", "+.....+..+....", "+.............", "++++++++++++++"}; femon-2.2.1/symbols/h264.xpm0000644000000000000000000000156612507636100014227 0ustar rootroot/* XPM */ static const char *const h264_xpm[] = { "40 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++", "+......................................+", "+..++...++.....+++++...+++++.......++..+", "+..++...++....+++++++.+++++++.....+++..+", "+..++...++....++...++.++...++....++++..+", "+..++...++.........++.++........+++....+", "+..++...++.........++.++.......+++.....+", "+..++...++........+++.++......+++......+", "+..+++++++.......+++..++++++..++...++..+", "+..+++++++......+++...+++++++.+++++++..+", "+..++...++.....+++....++...++.+++++++..+", "+..++...++....+++.....++...++......++..+", "+..++...++....++......++...++......++..+", "+..++...++....++...++.++...++......++..+", "+..++...++.++.+++++++.+++++++......++..+", "+..++...++.++.+++++++..+++++.......++..+", "+......................................+", "++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/dolbydigital20.xpm0000644000000000000000000000221612507636100016346 0ustar rootroot/* XPM */ static const char *const dolbydigital20_xpm[] = { "55 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++", "+.....................................................+", "+...+++++++++++.+++++++++++.....++++.........++++.....+", "+...++.++++++++.++++++++.++...+++++++.......++++++....+", "+...++...++++++.++++++...++...++....++......++..++....+", "+...++.....++++.++++.....++.........++.....++....++...+", "+...++......+++.+++......++.........++.....++....++...+", "+...++.......++.++.......++........+++.....++....++...+", "+...++.......++.++.......++.......+++......++....++...+", "+...++.......++.++.......++......+++.......++....++...+", "+...++.......++.++.......++.....+++........++....++...+", "+...++......+++.+++......++....+++.........++....++...+", "+...++.....++++.++++.....++...+++..........++....++...+", "+...++...++++++.++++++...++...++............++..++....+", "+...++.++++++++.++++++++.++...++++++++..++..++++++....+", "+...+++++++++++.+++++++++++...++++++++..++...++++.....+", "+.....................................................+", "+++++++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/pal.xpm0000644000000000000000000000075112507636100014313 0ustar rootroot/* XPM */ static const char *const pal_xpm[] = { "18 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++", "+................+", "+...++++++++.....+", "+...+++++++++....+", "+...++.....+++...+", "+...++......++...+", "+...++......++...+", "+...++.....+++...+", "+...+++++++++....+", "+...++++++++.....+", "+...++...........+", "+...++...........+", "+...++...........+", "+...++...........+", "+...++...........+", "+...++...........+", "+................+", "++++++++++++++++++"}; femon-2.2.1/symbols/eight.xpm0000644000000000000000000000066512507636100014643 0ustar rootroot/* XPM */ static const char *const eight_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", ".....++++.....+", "....++++++....+", "....++..++....+", "...++....++...+", "...++....++...+", "....++..++....+", ".....++++.....+", ".....++++.....+", "....++..++....+", "...++....++...+", "...++....++...+", "....++..++....+", "....++++++....+", ".....++++.....+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/carrier.xpm0000644000000000000000000000371512507636100015171 0ustar rootroot/* XPM */ static const char *const carrier_xpm[] = { "96 19 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++............................................................................................++", "++............................................................................................++", "++...........+++++.......+++++.....++++++++....++++++++....+++...++++++++...++++++++..........++", "++..........+++++++......+++++.....+++++++++...+++++++++...+++...++++++++...+++++++++.........++", "++..........+++.++++.....+++++.....+++...+++...+++...+++...+++...+++........+++...+++.........++", "++.........+++...++.....+++.+++....+++...+++...+++...+++...+++...+++........+++...+++.........++", "++.........+++..........+++.+++....++++++++....++++++++....+++...+++++++....++++++++..........++", "++.........+++..........+++.+++....+++++++.....+++++++.....+++...+++++++....+++++++...........++", "++.........+++.........+++...+++...+++..+++....+++..+++....+++...+++........+++..+++..........++", "++.........+++...++....+++++++++...+++..+++....+++..+++....+++...+++........+++..+++..........++", "++..........+++.++++...+++++++++...+++...+++...+++...+++...+++...+++........+++...+++.........++", "++..........+++++++...+++.....+++..+++...+++...+++...+++...+++...++++++++...+++...+++.........++", "++...........+++++....+++.....+++..+++....+++..+++....+++..+++...++++++++...+++....+++........++", "++............................................................................................++", "++............................................................................................++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/zero.xpm0000644000000000000000000000066412507636100014521 0ustar rootroot/* XPM */ static const char *const zero_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", ".....++++.....+", "....++++++....+", "....++..++....+", "...++....++...+", "...++....++...+", "...++....++...+", "...++....++...+", "...++....++...+", "...++....++...+", "...++....++...+", "...++....++...+", "....++..++....+", "....++++++....+", ".....++++.....+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/monoright.xpm0000644000000000000000000000073512507636100015547 0ustar rootroot/* XPM */ static const char *const monoright_xpm[] = { "17 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++", "+................", "+..............++", "+............++++", "+..........++++++", "+........++++++++", "+...+++++++++++++", "+...+++++++++++++", "+...++..+++++++++", "+...++..+++++++++", "+...+++++++++++++", "+...+++++++++++++", "+........++++++++", "+..........++++++", "+............++++", "+.............+++", "+................", "+++++++++++++++++"}; femon-2.2.1/symbols/ar2211.xpm0000644000000000000000000000212012507636100014437 0ustar rootroot/* XPM */ static const char *const ar2211_xpm[] = { "52 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++++++++++++", "+..................................................+", "+.....++++..........++++........++...........++....+", "+...+++++++.......+++++++....+++++........+++++....+", "+...++....++......++....++...+++++........+++++....+", "+.........++............++......++...++......++....+", "+.........++............++......++...++......++....+", "+........+++...........+++......++...........++....+", "+.......+++...........+++.......++...........++....+", "+......+++...........+++........++...........++....+", "+.....+++...........+++.........++...........++....+", "+....+++...........+++..........++...........++....+", "+...+++...........+++...........++...........++....+", "+...++............++............++...........++....+", "+...++++++++..++..++++++++......++...++......++....+", "+...++++++++..++..++++++++......++...++......++....+", "+..................................................+", "++++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/stereo.xpm0000644000000000000000000000073212507636100015037 0ustar rootroot/* XPM */ static const char *const stereo_xpm[] = { "17 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++", "+................", "+..............++", "+............++++", "+..........+++.++", "+........+++...++", "+...+++++++....++", "+...++++++.....++", "+...++..++.....++", "+...++..++.....++", "+...++++++.....++", "+...+++++++....++", "+........+++...++", "+..........+++.++", "+............++++", "+.............+++", "+................", "+++++++++++++++++"}; femon-2.2.1/symbols/format576p.xpm0000644000000000000000000000157412507636100015455 0ustar rootroot/* XPM */ static const char *const format576p_xpm[] = { "40 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++", "+......................................+", "+...+++++++.++++++++..++++++...........+", "+...+++++++.++++++++.++++++++..........+", "+...++......++....++.+++...++..........+", "+...++............++.++................+", "+...++...........+++.++................+", "+...++++++.......++..++.+++...++++.....+", "+...+++++++......++..+++++++..+++++....+", "+...++...+++....+++..+++..+++.++..++...+", "+.........++....++...++....++.++..++...+", "+.........++....++...++....++.+++++....+", "+...++....++...+++...++....++.++++.....+", "+...++...+++...++....+++..+++.++.......+", "+...+++++++....++....+++++++..++.......+", "+....+++++.....++.....+++++...++.......+", "+......................................+", "++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/ar11.xpm0000644000000000000000000000117212507636100014301 0ustar rootroot/* XPM */ static const char *const ar11_xpm[] = { "26 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++", "+........................+", "+......++..........++....+", "+...+++++.......+++++....+", "+...+++++.......+++++....+", "+......++...++.....++....+", "+......++...++.....++....+", "+......++..........++....+", "+......++..........++....+", "+......++..........++....+", "+......++..........++....+", "+......++..........++....+", "+......++..........++....+", "+......++..........++....+", "+......++...++.....++....+", "+......++...++.....++....+", "+........................+", "++++++++++++++++++++++++++"}; femon-2.2.1/symbols/format480p.xpm0000644000000000000000000000164012507636100015441 0ustar rootroot/* XPM */ static const char *const format480p_xpm[] = { "42 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++", "+........................................+", "+.........++....++++.....++++............+", "+........+++...++++++...++++++...........+", "+.......++++...++..++...++..++...........+", "+......++.++..++....++.++....++..........+", "+.....++..++..++....++.++....++..........+", "+.....++..++...++..++..++....++.++++.....+", "+....++...++....++++...++....++.+++++....+", "+...++....++....++++...++....++.++..++...+", "+...+++++++++..++..++..++....++.++..++...+", "+...+++++++++.++....++.++....++.+++++....+", "+.........++..++....++.++....++.++++.....+", "+.........++...++..++...++..++..++.......+", "+.........++...++++++...++++++..++.......+", "+.........++....++++.....++++...++.......+", "+........................................+", "++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/format1080p.xpm0000644000000000000000000000177312507636100015525 0ustar rootroot/* XPM */ static const char *const format1080p_xpm[] = { "47 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++++++++++++++++++", "+.............................................+", "+......++...++++.....++++.....++++............+", "+...+++++..++++++...++++++...++++++...........+", "+...+++++..++..++...++..++...++..++...........+", "+......++.++....++.++....++.++....++..........+", "+......++.++....++.++....++.++....++..........+", "+......++.++....++..++..++..++....++.++++.....+", "+......++.++....++...++++...++....++.+++++....+", "+......++.++....++...++++...++....++.++..++...+", "+......++.++....++..++..++..++....++.++..++...+", "+......++.++....++.++....++.++....++.+++++....+", "+......++.++....++.++....++.++....++.++++.....+", "+......++..++..++...++..++...++..++..++.......+", "+......++..++++++...++++++...++++++..++.......+", "+......++...++++.....++++.....++++...++.......+", "+.............................................+", "+++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/signal.xpm0000644000000000000000000000371412507636100015016 0ustar rootroot/* XPM */ static const char *const signal_xpm[] = { "96 19 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++............................................................................................++", "++............................................................................................++", "++.................+++++....+++......+++++.....+++....+++.....+++++.....+++...................++", "++...............++++++++...+++....++++++++....++++...+++.....+++++.....+++...................++", "++...............+++..+++...+++....+++..++++...+++++..+++.....+++++.....+++...................++", "++...............+++........+++...+++....++....+++++..+++....+++.+++....+++...................++", "++...............++++++.....+++...+++..........++++++.+++....+++.+++....+++...................++", "++................++++++....+++...+++..+++++...+++.++.+++....+++.+++....+++...................++", "++..................+++++...+++...+++..+++++...+++.++++++...+++...+++...+++...................++", "++...............+++..+++...+++...+++....+++...+++..+++++...+++++++++...+++...................++", "++...............+++..+++...+++....+++...+++...+++..+++++...+++++++++...+++...................++", "++................++++++....+++....+++++++++...+++...++++..+++.....+++..+++++++...............++", "++.................++++.....+++......+++++.....+++....+++..+++.....+++..+++++++...............++", "++............................................................................................++", "++............................................................................................++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/five.xpm0000644000000000000000000000066412507636100014473 0ustar rootroot/* XPM */ static const char *const five_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", "...+++++++....+", "...+++++++....+", "...++.........+", "...++.........+", "...++.........+", "...++++++.....+", "...+++++++....+", "...++...+++...+", ".........++...+", ".........++...+", "...++....++...+", "...++...+++...+", "...+++++++....+", "....+++++.....+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/format1080.xpm0000644000000000000000000000157412507636100015344 0ustar rootroot/* XPM */ static const char *const format1080_xpm[] = { "40 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++", "+......................................+", "+......++...++++.....++++.....++++.....+", "+...+++++..++++++...++++++...++++++....+", "+...+++++..++..++...++..++...++..++....+", "+......++.++....++.++....++.++....++...+", "+......++.++....++.++....++.++....++...+", "+......++.++....++..++..++..++....++...+", "+......++.++....++...++++...++....++...+", "+......++.++....++...++++...++....++...+", "+......++.++....++..++..++..++....++...+", "+......++.++....++.++....++.++....++...+", "+......++.++....++.++....++.++....++...+", "+......++..++..++...++..++...++..++....+", "+......++..++++++...++++++...++++++....+", "+......++...++++.....++++.....++++.....+", "+......................................+", "++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/seven.xpm0000644000000000000000000000066512507636100014663 0ustar rootroot/* XPM */ static const char *const seven_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", "...++++++++...+", "...++++++++...+", "...++....++...+", ".........++...+", "........+++...+", "........++....+", "........++....+", ".......+++....+", ".......++.....+", ".......++.....+", "......+++.....+", "......++......+", "......++......+", "......++......+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/mpeg2.xpm0000644000000000000000000000167712507636100014561 0ustar rootroot/* XPM */ static const char *const mpeg2_xpm[] = { "44 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++++", "+..........................................+", "+..++....++.+++++...+++++..+++++...+++++...+", "+..++....++.++++++..+++++.+++++++.+++++++..+", "+..+++..+++.++..+++.++....+++..++.++...++..+", "+..+++..+++.++...++.++....++...........++..+", "+..++++++++.++...++.++....++...........++..+", "+..++++++++.++..+++.++....++..........+++..+", "+..++.++.++.++++++..++++..++.++++....+++...+", "+..++.++.++.+++++...++++..++.++++...+++....+", "+..++....++.++......++....++...++..+++.....+", "+..++....++.++......++....++...++.+++......+", "+..++....++.++......++....++...++.++.......+", "+..++....++.++......++....+++..++.++...++..+", "+..++....++.++......+++++.+++++++.+++++++..+", "+..++....++.++......+++++..+++++..+++++++..+", "+..........................................+", "++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/two.xpm0000644000000000000000000000066312507636100014352 0ustar rootroot/* XPM */ static const char *const two_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", ".....++++.....+", "...+++++++....+", "...++....++...+", ".........++...+", ".........++...+", "........+++...+", ".......+++....+", "......+++.....+", ".....+++......+", "....+++.......+", "...+++........+", "...++.........+", "...++++++++...+", "...++++++++...+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/ar43.xpm0000644000000000000000000000132412507636100014305 0ustar rootroot/* XPM */ static const char *const ar43_xpm[] = { "31 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++", "+.............................+", "+.........++.........+++++....+", "+........+++........+++++++...+", "+.......++++.......++....++...+", "+......++.++...++..++....++...+", "+.....++..++...++........++...+", "+.....++..++............++....+", "+....++...++..........+++.....+", "+...++....++..........++++....+", "+...+++++++++...........+++...+", "+...+++++++++............++...+", "+.........++.......++....++...+", "+.........++.......++...+++...+", "+.........++...++...++++++....+", "+.........++...++....++++.....+", "+.............................+", "+++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/format480.xpm0000644000000000000000000000144112507636100015260 0ustar rootroot/* XPM */ static const char *const format480_xpm[] = { "35 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++++++", "+.................................+", "+.........++....++++.....++++.....+", "+........+++...++++++...++++++....+", "+.......++++...++..++...++..++....+", "+......++.++..++....++.++....++...+", "+.....++..++..++....++.++....++...+", "+.....++..++...++..++..++....++...+", "+....++...++....++++...++....++...+", "+...++....++....++++...++....++...+", "+...+++++++++..++..++..++....++...+", "+...+++++++++.++....++.++....++...+", "+.........++..++....++.++....++...+", "+.........++...++..++...++..++....+", "+.........++...++++++...++++++....+", "+.........++....++++.....++++.....+", "+.................................+", "+++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/four.xpm0000644000000000000000000000066412507636100014515 0ustar rootroot/* XPM */ static const char *const four_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", ".........++...+", "........+++...+", ".......++++...+", "......++.++...+", ".....++..++...+", ".....++..++...+", "....++...++...+", "...++....++...+", "...+++++++++..+", "...+++++++++..+", ".........++...+", ".........++...+", ".........++...+", ".........++...+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/ar169.xpm0000644000000000000000000000152312507636100014377 0ustar rootroot/* XPM */ static const char *const ar169_xpm[] = { "38 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++", "+....................................+", "+......++.....++++..........++++.....+", "+...+++++....+++++++.......++++++....+", "+...+++++....++...++......++...+++...+", "+......++...++........++..++....++...+", "+......++...++........++..++....++...+", "+......++...++............++....++...+", "+......++...++.+++.........+++++++...+", "+......++...+++++++.........+++.++...+", "+......++...++....++............++...+", "+......++...++....++............++...+", "+......++...++....++............++...+", "+......++...+++...++......++...++....+", "+......++....++++++...++..+++++++....+", "+......++.....++++....++...+++++.....+", "+....................................+", "++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/format576i.xpm0000644000000000000000000000146412507636100015444 0ustar rootroot/* XPM */ static const char *const format576i_xpm[] = { "36 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++", "+..................................+", "+...+++++++.++++++++..++++++.......+", "+...+++++++.++++++++.++++++++......+", "+...++......++....++.+++...++......+", "+...++............++.++............+", "+...++...........+++.++.......++...+", "+...++++++.......++..++.+++...++...+", "+...+++++++......++..+++++++.......+", "+...++...+++....+++..+++..+++.++...+", "+.........++....++...++....++.++...+", "+.........++....++...++....++.++...+", "+...++....++...+++...++....++.++...+", "+...++...+++...++....+++..+++.++...+", "+...+++++++....++....+++++++..++...+", "+....+++++.....++.....+++++...++...+", "+..................................+", "++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/sync.xpm0000644000000000000000000000371212507636100014513 0ustar rootroot/* XPM */ static const char *const sync_xpm[] = { "96 19 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++............................................................................................++", "++............................................................................................++", "++.........................+++++...+++.....+++..+++....+++.....+++++..........................++", "++.......................++++++++...+++...+++...++++...+++....+++++++.........................++", "++.......................+++..+++....+++.+++....+++++..+++....+++.++++........................++", "++.......................+++.........+++.+++....+++++..+++...+++...++.........................++", "++.......................++++++.......+++++.....++++++.+++...+++..............................++", "++........................++++++......+++++.....+++.++.+++...+++..............................++", "++..........................+++++......+++......+++.++++++...+++..............................++", "++.......................+++..+++......+++......+++..+++++...+++...++.........................++", "++.......................+++..+++......+++......+++..+++++....+++.++++........................++", "++........................++++++.......+++......+++...++++....+++++++.........................++", "++.........................++++........+++......+++....+++.....+++++..........................++", "++............................................................................................++", "++............................................................................................++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/format720.xpm0000644000000000000000000000141712507636100015260 0ustar rootroot/* XPM */ static const char *const format720_xpm[] = { "34 18 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++", "+................................+", "+...++++++++...++++.....++++.....+", "+...++++++++.+++++++...++++++....+", "+...++....++.++....++..++..++....+", "+.........++.......++.++....++...+", "+.........++.......++.++....++...+", "+.........++.......++.++....++...+", "+........++......+++..++....++...+", "+.......+++.....+++...++....++...+", "+.......++.....+++....++....++...+", "+.......++....+++.....++....++...+", "+......+++...+++......++....++...+", "+......++....++........++..++....+", "+......++....++++++++..++++++....+", "+......++....++++++++...++++.....+", "+................................+", "++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/viterbi.xpm0000644000000000000000000000371512507636100015206 0ustar rootroot/* XPM */ static const char *const viterbi_xpm[] = { "96 19 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++............................................................................................++", "++............................................................................................++", "++............+++.....+++..+++...+++++++++..++++++++...++++++++....++++++++....+++............++", "++.............++.....++...+++...+++++++++..++++++++...+++++++++...+++++++++...+++............++", "++.............+++...+++...+++......+++.....+++........+++...+++...+++...+++...+++............++", "++.............+++...+++...+++......+++.....+++........+++...+++...+++...+++...+++............++", "++..............++...++....+++......+++.....+++++++....++++++++....++++++++....+++............++", "++..............+++.+++....+++......+++.....+++++++....+++++++.....++++++++....+++............++", "++..............+++.+++....+++......+++.....+++........+++..+++....+++...+++...+++............++", "++...............++.++.....+++......+++.....+++........+++..+++....+++...+++...+++............++", "++...............+++++.....+++......+++.....+++........+++...+++...+++...+++...+++............++", "++...............+++++.....+++......+++.....++++++++...+++...+++...+++++++++...+++............++", "++................+++......+++......+++.....++++++++...+++....+++..++++++++....+++............++", "++............................................................................................++", "++............................................................................................++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/three.xpm0000644000000000000000000000066512507636100014652 0ustar rootroot/* XPM */ static const char *const three_xpm[] = { "15 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++", "..............+", ".....+++++....+", "....+++++++...+", "...++....++...+", "...++....++...+", ".........++...+", "........++....+", "......+++.....+", "......++++....+", "........+++...+", ".........++...+", "...++....++...+", "...++...+++...+", "....++++++....+", ".....++++.....+", "..............+", "+++++++++++++++"}; femon-2.2.1/symbols/format720i.xpm0000644000000000000000000000150612507636100015430 0ustar rootroot/* XPM */ static const char *const format720i_xpm[] = { "37 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++++++++", "+...................................+", "+...++++++++...++++.....++++........+", "+...++++++++.+++++++...++++++.......+", "+...++....++.++....++..++..++.......+", "+.........++.......++.++....++......+", "+.........++.......++.++....++.++...+", "+.........++.......++.++....++.++...+", "+........++......+++..++....++......+", "+.......+++.....+++...++....++.++...+", "+.......++.....+++....++....++.++...+", "+.......++....+++.....++....++.++...+", "+......+++...+++......++....++.++...+", "+......++....++........++..++..++...+", "+......++....++++++++..++++++..++...+", "+......++....++++++++...++++...++...+", "+...................................+", "+++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/dolbydigital51.xpm0000644000000000000000000000210612507636100016350 0ustar rootroot/* XPM */ static const char *const dolbydigital51_xpm[] = { "51 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++++++++++++++++++++++++++++++++++++", "+.................................................+", "+...+++++++++++.+++++++++++...+++++++........++...+", "+...++.++++++++.++++++++.++...+++++++.....+++++...+", "+...++...++++++.++++++...++...++..........+++++...+", "+...++.....++++.++++.....++...++.............++...+", "+...++......+++.+++......++...++++++.........++...+", "+...++.......++.++.......++...+++++++........++...+", "+...++.......++.++.......++...++...+++.......++...+", "+...++.......++.++.......++.........++.......++...+", "+...++.......++.++.......++.........++.......++...+", "+...++......+++.+++......++.........++.......++...+", "+...++.....++++.++++.....++...++....++.......++...+", "+...++...++++++.++++++...++...++...+++.......++...+", "+...++.++++++++.++++++++.++...+++++++...++...++...+", "+...+++++++++++.+++++++++++....+++++....++...++...+", "+.................................................+", "+++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/lock.xpm0000644000000000000000000000371212507636100014467 0ustar rootroot/* XPM */ static const char *const lock_xpm[] = { "96 19 2 1", ". c #FFFFFF", "+ c #000000", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++............................................................................................++", "++............................................................................................++", "++........................+++........+++++........+++++.....+++....+++........................++", "++........................+++.......++++++++.....+++++++....+++...+++.........................++", "++........................+++.......+++..+++.....+++.++++...+++..+++..........................++", "++........................+++......+++....+++...+++...++....+++.+++...........................++", "++........................+++......+++....+++...+++.........+++++++...........................++", "++........................+++......+++....+++...+++.........++++.+++..........................++", "++........................+++......+++....+++...+++.........+++..+++..........................++", "++........................+++......+++....+++...+++...++....+++...+++.........................++", "++........................+++.......+++..+++.....+++.++++...+++...+++.........................++", "++........................+++++++...++++++++.....+++++++....+++....+++........................++", "++........................+++++++.....++++........+++++.....+++.....+++.......................++", "++............................................................................................++", "++............................................................................................++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"}; femon-2.2.1/symbols/monoleft.xpm0000644000000000000000000000073412507636100015363 0ustar rootroot/* XPM */ static const char *const monoleft_xpm[] = { "17 18 2 1", ". c #FFFFFF", "+ c #000000", "+++++++++++++++++", "+................", "+...++...........", "+...++++.........", "+...++++++.......", "+...++++++++.....", "+...+++++++++++++", "+...+++++++++++++", "+...+++++++++..++", "+...+++++++++..++", "+...+++++++++++++", "+...+++++++++++++", "+...++++++++.....", "+...++++++.......", "+...++++.........", "+...+++..........", "+................", "+++++++++++++++++"}; femon-2.2.1/audio.h0000644000000000000000000001005012507636100012564 0ustar rootroot/* * audio.h: Frontend Status Monitor plugin for the AUDIO Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_AUDIO_H #define __FEMON_AUDIO_H enum eAudioCodec { AUDIO_CODEC_INVALID = -1, AUDIO_CODEC_UNKNOWN, AUDIO_CODEC_MPEG1_I, AUDIO_CODEC_MPEG1_II, AUDIO_CODEC_MPEG1_III, AUDIO_CODEC_MPEG2_I, AUDIO_CODEC_MPEG2_II, AUDIO_CODEC_MPEG2_III, AUDIO_CODEC_HEAAC, AUDIO_CODEC_LATM }; enum eAudioChannelMode { AUDIO_CHANNEL_MODE_INVALID = -1, AUDIO_CHANNEL_MODE_STEREO, AUDIO_CHANNEL_MODE_JOINT_STEREO, AUDIO_CHANNEL_MODE_DUAL, AUDIO_CHANNEL_MODE_SINGLE }; enum eAudioBitrate { AUDIO_BITRATE_RESERVED = -3, AUDIO_BITRATE_FREE = -2, AUDIO_BITRATE_INVALID = -1 }; enum eAudioSamplingFrequency { AUDIO_SAMPLING_FREQUENCY_RESERVED = -2, AUDIO_SAMPLING_FREQUENCY_INVALID = -1 }; enum eAudioCenterMixLevel { AUDIO_CENTER_MIX_LEVEL_INVALID = -1, AUDIO_CENTER_MIX_LEVEL_MINUS_3dB, AUDIO_CENTER_MIX_LEVEL_MINUS_4_5dB, AUDIO_CENTER_MIX_LEVEL_MINUS_6dB, AUDIO_CENTER_MIX_LEVEL_RESERVED }; enum eAudioSurroundMixLevel { AUDIO_SURROUND_MIX_LEVEL_INVALID = -1, AUDIO_SURROUND_MIX_LEVEL_MINUS_3dB, AUDIO_SURROUND_MIX_LEVEL_MINUS_6dB, AUDIO_SURROUND_MIX_LEVEL_0_dB, AUDIO_SURROUND_MIX_LEVEL_RESERVED }; enum eAudioDolbySurroundMode { AUDIO_DOLBY_SURROUND_MODE_INVALID = -1, AUDIO_DOLBY_SURROUND_MODE_NOT_INDICATED, AUDIO_DOLBY_SURROUND_MODE_NOT_DOLBYSURROUND, AUDIO_DOLBY_SURROUND_MODE_DOLBYSURROUND, AUDIO_DOLBY_SURROUND_MODE_RESERVED }; enum eAudioBitstreamMode { AUDIO_BITSTREAM_MODE_INVALID = -1, AUDIO_BITSTREAM_MODE_CM, AUDIO_BITSTREAM_MODE_ME, AUDIO_BITSTREAM_MODE_VI, AUDIO_BITSTREAM_MODE_HI, AUDIO_BITSTREAM_MODE_D, AUDIO_BITSTREAM_MODE_C, AUDIO_BITSTREAM_MODE_E, AUDIO_BITSTREAM_MODE_VO_KAR }; enum eAudioCodingMode { AUDIO_CODING_MODE_INVALID = -1, AUDIO_CODING_MODE_1_1, AUDIO_CODING_MODE_1_0, AUDIO_CODING_MODE_2_0, AUDIO_CODING_MODE_3_0, AUDIO_CODING_MODE_2_1, AUDIO_CODING_MODE_3_1, AUDIO_CODING_MODE_2_2, AUDIO_CODING_MODE_3_2, }; typedef struct audio_info { eAudioCodec codec; // enum double bitrate; // bit/s or eAudioBitrate int samplingFrequency; // Hz or eAudioSamplingFrequency int channelMode; // eAudioChannelMode } audio_info_t; typedef struct ac3_info { int bitrate; // bit/s or eAudioBitrate int samplingFrequency; // Hz or eAudioSamplingFrequency int bitstreamMode; // 0..7 or eAudioBitstreamMode int audioCodingMode; // 0..7 or eAudioCodingMode int dolbySurroundMode; // eAudioDolbySurroundMode int centerMixLevel; // eAudioCenterMixLevel int surroundMixLevel; // eAudioSurroundMixLevel int dialogLevel; // -dB bool lfe; // boolean } ac3_info_t; class cFemonAudioIf { public: cFemonAudioIf() {} virtual ~cFemonAudioIf() {} // enum virtual void SetAudioCodec(eAudioCodec codecP) = 0; // kbit/s or eAudioBitrate virtual void SetAudioBitrate(double bitRateP) = 0; // Hz or eAudioSamplingFrequency virtual void SetAudioSamplingFrequency(int samplingP) = 0; // eAudioChannelMode virtual void SetAudioChannel(eAudioChannelMode modeP) = 0; }; class cFemonAC3If { public: cFemonAC3If() {} virtual ~cFemonAC3If() {} // bit/s or eAudioBitrate virtual void SetAC3Bitrate(int bitRateP) = 0; // Hz or eAudioSamplingFrequency virtual void SetAC3SamplingFrequency(int samplingP) = 0; // 0..7 or eAudioBitstreamMode virtual void SetAC3Bitstream(int modeP) = 0; // 0..7 or eAudioCodingMode virtual void SetAC3AudioCoding(int modeP) = 0; // eAudioDolbySurroundMode virtual void SetAC3DolbySurround(int modeP) = 0; // eAudioCenterMixLevel virtual void SetAC3CenterMix(int levelP) = 0; // eAudioSurroundMixLevel virtual void SetAC3SurroundMix(int levelP) = 0; // -dB virtual void SetAC3Dialog(int levelP) = 0; // boolean virtual void SetAC3LFE(bool onoffP) = 0; }; #endif //__FEMON_AUDIO_H femon-2.2.1/video.h0000644000000000000000000000440312507636100012576 0ustar rootroot/* * video.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_VIDEO_H #define __FEMON_VIDEO_H enum eVideoCodec { VIDEO_CODEC_INVALID = -1, VIDEO_CODEC_UNKNOWN, VIDEO_CODEC_MPEG2, VIDEO_CODEC_H264 }; enum eVideoFormat { VIDEO_FORMAT_INVALID = -1, VIDEO_FORMAT_UNKNOWN, VIDEO_FORMAT_RESERVED, VIDEO_FORMAT_COMPONENT, VIDEO_FORMAT_PAL, VIDEO_FORMAT_NTSC, VIDEO_FORMAT_SECAM, VIDEO_FORMAT_MAC }; enum eVideoScan { VIDEO_SCAN_INVALID = -1, VIDEO_SCAN_UNKNOWN, VIDEO_SCAN_RESERVED, VIDEO_SCAN_INTERLACED, VIDEO_SCAN_PROGRESSIVE }; enum eVideoAspectRatio { VIDEO_ASPECT_RATIO_INVALID = -1, VIDEO_ASPECT_RATIO_RESERVED, VIDEO_ASPECT_RATIO_EXTENDED, VIDEO_ASPECT_RATIO_1_1, VIDEO_ASPECT_RATIO_4_3, VIDEO_ASPECT_RATIO_16_9, VIDEO_ASPECT_RATIO_2_21_1, VIDEO_ASPECT_RATIO_12_11, VIDEO_ASPECT_RATIO_10_11, VIDEO_ASPECT_RATIO_16_11, VIDEO_ASPECT_RATIO_40_33, VIDEO_ASPECT_RATIO_24_11, VIDEO_ASPECT_RATIO_20_11, VIDEO_ASPECT_RATIO_32_11, VIDEO_ASPECT_RATIO_80_33, VIDEO_ASPECT_RATIO_18_11, VIDEO_ASPECT_RATIO_15_11, VIDEO_ASPECT_RATIO_64_33, VIDEO_ASPECT_RATIO_160_99, VIDEO_ASPECT_RATIO_3_2, VIDEO_ASPECT_RATIO_2_1 }; typedef struct video_info { eVideoCodec codec; // enum eVideoFormat format; // enum eVideoScan scan; // enum eVideoAspectRatio aspectRatio; // enum int width; // pixels int height; // pixels double frameRate; // Hz double bitrate; // bit/s } video_info_t; class cFemonVideoIf { public: cFemonVideoIf() {} virtual ~cFemonVideoIf() {} // eVideoCodec virtual void SetVideoCodec(eVideoCodec codecP) = 0; // eVideoFormat virtual void SetVideoFormat(eVideoFormat formatP) = 0; // eVideoScan virtual void SetVideoScan(eVideoScan scanP) = 0; // eVideoAspectRatio virtual void SetVideoAspectRatio(eVideoAspectRatio aspectRatioP) = 0; // pixels virtual void SetVideoSize(int widthP, int heightP) = 0; // Hz virtual void SetVideoFramerate(double frameRateP) = 0; // Mbit/s virtual void SetVideoBitrate(double bitRateP) = 0; }; #endif //__FEMON_VIDEO_H femon-2.2.1/aac.c0000644000000000000000000000562212507636100012213 0ustar rootroot/* * aac.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "tools.h" #include "aac.h" #define IS_HEAAC_AUDIO(buf) (((buf)[0] == 0xFF) && (((buf)[1] & 0xF6) == 0xF0)) int cFemonAAC::sampleRateS[16] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, -1, -1, -1, -1 }; cFemonAAC::cFemonAAC(cFemonAudioIf *audioHandlerP) : audioHandlerM(audioHandlerP) { } cFemonAAC::~cFemonAAC() { } bool cFemonAAC::processAudio(const uint8_t *bufP, int lenP) { cFemonBitStream bs(bufP, lenP * 8); if (!audioHandlerM) return false; /* ADTS Fixed Header: * syncword 12b always: '111111111111' * id 1b 0: MPEG-4, 1: MPEG-2 * layer 2b always: '00' * protection_absent 1b * profile 2b 0: Main profile AAC MAIN 1: Low Complexity profile (LC) AAC LC 2: Scalable Sample Rate profile (SSR) AAC SSR 3: (reserved) AAC LTP * sampling_frequency_index 4b * private_bit 1b * channel_configuration 3b * original/copy 1b * home 1b * emphasis 2b only if ID == 0 (ie MPEG-4) */ // skip PES header if (!PesLongEnough(lenP)) return false; bs.SkipBits(8 * PesPayloadOffset(bufP)); // HE-AAC audio detection if (bs.GetBits(12) != 0xFFF) // syncword return false; bs.SkipBit(); // id // layer must be 0 if (bs.GetBits(2)) // layer return false; bs.SkipBit(); // protection_absent bs.SkipBits(2); // profile int sampling_frequency_index = bs.GetBits(4); // sampling_frequency_index bs.SkipBit(); // private pid int channel_configuration = bs.GetBits(3); // channel_configuration audioHandlerM->SetAudioCodec(AUDIO_CODEC_HEAAC); audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED); switch (channel_configuration) { case 0: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO); break; case 1: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO); break; case 2: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL); break; case 3: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE); break; default: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID); break; } switch (sampling_frequency_index) { case 0xC ... 0xF: audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED); break; default: audioHandlerM->SetAudioSamplingFrequency(sampleRateS[sampling_frequency_index]); break; } return true; } femon-2.2.1/receiver.h0000644000000000000000000002436712507636100013307 0ustar rootroot/* * receiver.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_RECEIVER_H #define __FEMON_RECEIVER_H #include #include #include "aac.h" #include "ac3.h" #include "audio.h" #include "h264.h" #include "latm.h" #include "mpeg.h" #include "tools.h" #include "video.h" class cFemonReceiver : public cReceiver, public cThread, public cFemonVideoIf, public cFemonAudioIf, public cFemonAC3If { private: cMutex mutexM; cCondWait sleepM; bool activeM; cFemonH264 detectH264M; cFemonMPEG detectMpegM; cFemonAAC detectAacM; cFemonLATM detectLatmM; cFemonAC3 detectAc3M; cRingBufferLinear videoBufferM; cTsToPes videoAssemblerM; int videoTypeM; int videoPidM; int videoPacketCountM; double videoBitRateM; bool videoValidM; video_info_t videoInfoM; cRingBufferLinear audioBufferM; cTsToPes audioAssemblerM; int audioPidM; int audioPacketCountM; double audioBitRateM; bool audioValidM; audio_info_t audioInfoM; cRingBufferLinear ac3BufferM; cTsToPes ac3AssemblerM; int ac3PidM; int ac3PacketCountM; double ac3BitRateM; bool ac3ValidM; ac3_info_t ac3InfoM; protected: virtual void Activate(bool onP); virtual void Receive(uchar *dataP, int lengthP); virtual void Action(void); public: virtual void SetVideoCodec(eVideoCodec codecP) { cMutexLock MutexLock(&mutexM); videoInfoM.codec = codecP; } virtual void SetVideoFormat(eVideoFormat formatP) { cMutexLock MutexLock(&mutexM); videoInfoM.format = formatP; } virtual void SetVideoScan(eVideoScan scanP) { cMutexLock MutexLock(&mutexM); videoInfoM.scan = scanP; } virtual void SetVideoAspectRatio(eVideoAspectRatio aspectRatioP) { cMutexLock MutexLock(&mutexM); videoInfoM.aspectRatio = aspectRatioP; } virtual void SetVideoSize(int widthP, int heightP) { cMutexLock MutexLock(&mutexM); videoInfoM.width = widthP; videoInfoM.height = heightP; } virtual void SetVideoFramerate(double frameRateP) { cMutexLock MutexLock(&mutexM); videoInfoM.frameRate = frameRateP; } virtual void SetVideoBitrate(double bitRateP) { cMutexLock MutexLock(&mutexM); videoInfoM.bitrate = bitRateP; } virtual void SetAudioCodec(eAudioCodec codecP) { cMutexLock MutexLock(&mutexM); audioInfoM.codec = codecP; } virtual void SetAudioBitrate(double bitRateP) { cMutexLock MutexLock(&mutexM); audioInfoM.bitrate = bitRateP; } virtual void SetAudioSamplingFrequency(int samplingP) { cMutexLock MutexLock(&mutexM); audioInfoM.samplingFrequency = samplingP; } virtual void SetAudioChannel(eAudioChannelMode modeP) { cMutexLock MutexLock(&mutexM); audioInfoM.channelMode = modeP; } virtual void SetAC3Bitrate(int bitRateP) { cMutexLock MutexLock(&mutexM); ac3InfoM.bitrate = bitRateP; } virtual void SetAC3SamplingFrequency(int samplingP) { cMutexLock MutexLock(&mutexM); ac3InfoM.samplingFrequency = samplingP; } virtual void SetAC3Bitstream(int modeP) { cMutexLock MutexLock(&mutexM); ac3InfoM.bitstreamMode = modeP; } virtual void SetAC3AudioCoding(int modeP) { cMutexLock MutexLock(&mutexM); ac3InfoM.audioCodingMode = modeP; } virtual void SetAC3DolbySurround(int modeP) { cMutexLock MutexLock(&mutexM); ac3InfoM.dolbySurroundMode = modeP; } virtual void SetAC3CenterMix(int levelP) { cMutexLock MutexLock(&mutexM); ac3InfoM.centerMixLevel = levelP; } virtual void SetAC3SurroundMix(int levelP) { cMutexLock MutexLock(&mutexM); ac3InfoM.surroundMixLevel = levelP; } virtual void SetAC3Dialog(int levelP) { cMutexLock MutexLock(&mutexM); ac3InfoM.dialogLevel = levelP; } virtual void SetAC3LFE(bool onoffP) { cMutexLock MutexLock(&mutexM); ac3InfoM.lfe = onoffP; } public: cFemonReceiver(const cChannel* channelP, int aTrackp, int dTrackP); virtual ~cFemonReceiver(); void Deactivate(void); bool VideoValid(void) { cMutexLock MutexLock(&mutexM); return videoValidM; }; // boolean double VideoBitrate(void) { cMutexLock MutexLock(&mutexM); return videoBitRateM; }; // bit/s int VideoCodec(void) { cMutexLock MutexLock(&mutexM); return videoInfoM.codec; }; // eVideoCodec int VideoFormat(void) { cMutexLock MutexLock(&mutexM); return videoInfoM.format; }; // eVideoFormat int VideoScan(void) { cMutexLock MutexLock(&mutexM); return videoInfoM.scan; }; // eVideoScan int VideoAspectRatio(void) { cMutexLock MutexLock(&mutexM); return videoInfoM.aspectRatio; }; // eVideoAspectRatio int VideoHorizontalSize(void) { cMutexLock MutexLock(&mutexM); return videoInfoM.width; }; // pixels int VideoVerticalSize(void) { cMutexLock MutexLock(&mutexM); return videoInfoM.height; }; // pixels double VideoFrameRate(void) { cMutexLock MutexLock(&mutexM); return videoInfoM.frameRate; }; // Hz double VideoStreamBitrate(void) { cMutexLock MutexLock(&mutexM); return videoInfoM.bitrate; }; // bit/s bool AudioValid(void) { cMutexLock MutexLock(&mutexM); return audioValidM; }; // boolean double AudioBitrate(void) { cMutexLock MutexLock(&mutexM); return audioBitRateM; }; // bit/s int AudioCodec(void) { cMutexLock MutexLock(&mutexM); return audioInfoM.codec; }; // eAudioCodec int AudioChannelMode(void) { cMutexLock MutexLock(&mutexM); return audioInfoM.channelMode; }; // eAudioChannelMode double AudioStreamBitrate(void) { cMutexLock MutexLock(&mutexM); return audioInfoM.bitrate; }; // bit/s or eAudioBitrate int AudioSamplingFreq(void) { cMutexLock MutexLock(&mutexM); return audioInfoM.samplingFrequency; }; // Hz or eAudioSamplingFrequency bool AC3Valid(void) { cMutexLock MutexLock(&mutexM); return ac3ValidM; }; // boolean double AC3Bitrate(void) { cMutexLock MutexLock(&mutexM); return ac3BitRateM; }; // bit/s double AC3StreamBitrate(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.bitrate; }; // bit/s or eAudioBitrate int AC3SamplingFreq(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.samplingFrequency; }; // Hz or eAudioSamplingFrequency int AC3BitStreamMode(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.bitstreamMode; }; // 0..7 or eAudioBitstreamMode int AC3AudioCodingMode(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.audioCodingMode; }; // 0..7 or eAudioCodingMode bool AC3_2_0(void) { cMutexLock MutexLock(&mutexM); return (ac3InfoM.audioCodingMode == AUDIO_CODING_MODE_2_0); }; // boolean bool AC3_5_1(void) { cMutexLock MutexLock(&mutexM); return (ac3InfoM.audioCodingMode == AUDIO_CODING_MODE_3_2); }; // boolean int AC3DolbySurroundMode(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.dolbySurroundMode; }; // eAudioDolbySurroundMode int AC3CenterMixLevel(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.centerMixLevel; }; // eAudioCenterMixLevel int AC3SurroundMixLevel(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.surroundMixLevel; }; // eAudioSurroundMixLevel int AC3DialogLevel(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.dialogLevel; }; // -dB bool AC3Lfe(void) { cMutexLock MutexLock(&mutexM); return ac3InfoM.lfe; }; // boolean }; #endif //__FEMON_RECEIVER_H femon-2.2.1/femon.c0000644000000000000000000002562612507636100012601 0ustar rootroot/* * femon.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include #include #include #include #include "config.h" #include "femonservice.h" #include "log.h" #include "osd.h" #include "tools.h" #include "setup.h" #if defined(APIVERSNUM) && APIVERSNUM < 20200 #error "VDR-2.2.0 API version or greater is required!" #endif #ifndef GITVERSION #define GITVERSION "" #endif static const char VERSION[] = "2.2.1" GITVERSION; static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)"); static const char MAINMENUENTRY[] = trNOOP("Signal Information"); class cPluginFemon : public cPlugin { public: cPluginFemon(void); virtual ~cPluginFemon(); virtual const char *Version(void) { return VERSION; } virtual const char *Description(void) { return tr(DESCRIPTION); } virtual const char *CommandLineHelp(void); virtual bool ProcessArgs(int argc, char *argv[]); virtual bool Initialize(void); virtual bool Start(void); virtual void Stop(void); virtual void Housekeeping(void); virtual void MainThreadHook(void) {} virtual cString Active(void) { return NULL; } virtual const char *MainMenuEntry(void) { return (FemonConfig.GetHideMenu() ? NULL : tr(MAINMENUENTRY)); } virtual cOsdObject *MainMenuAction(void); virtual cMenuSetupPage *SetupMenu(void); virtual bool SetupParse(const char *nameP, const char *valueP); virtual bool Service(const char *idP, void *dataP); virtual const char **SVDRPHelpPages(void); virtual cString SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP); }; cPluginFemon::cPluginFemon() { // Initialize any member variables here. // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT! debug1("%s", __PRETTY_FUNCTION__); } cPluginFemon::~cPluginFemon() { // Clean up after yourself! debug1("%s", __PRETTY_FUNCTION__); } const char *cPluginFemon::CommandLineHelp(void) { // Return a string that describes all known command line options. return " -t , --trace= set the tracing mode\n"; } bool cPluginFemon::ProcessArgs(int argc, char *argv[]) { // Implement command line argument processing here if applicable. static const struct option long_options[] = { { "trace", required_argument, NULL, 't' }, { NULL, no_argument, NULL, 0 } }; cString server; int c; while ((c = getopt_long(argc, argv, "t:", long_options, NULL)) != -1) { switch (c) { case 't': FemonConfig.SetTraceMode(strtol(optarg, NULL, 0)); break; default: return false; } } return true; } bool cPluginFemon::Initialize(void) { // Initialize any background activities the plugin shall perform. return true; } bool cPluginFemon::Start(void) { // Start any background activities the plugin shall perform. return true; } void cPluginFemon::Stop(void) { // Stop the background activities. } void cPluginFemon::Housekeeping(void) { // Perform any cleanup or other regular tasks. } cOsdObject *cPluginFemon::MainMenuAction(void) { // Perform the action when selected from the main VDR menu. debug1("%s", __PRETTY_FUNCTION__); if (cControl::Control() || (Channels.Count() <= 0)) Skins.Message(mtInfo, tr("Femon not available")); else return cFemonOsd::Instance(true); return NULL; } cMenuSetupPage *cPluginFemon::SetupMenu(void) { // Return a setup menu in case the plugin supports one. return new cMenuFemonSetup; } bool cPluginFemon::SetupParse(const char *nameP, const char *valueP) { // Parse your own setup parameters and store their values. if (!strcasecmp(nameP, "HideMenu")) FemonConfig.SetHideMenu(atoi(valueP)); else if (!strcasecmp(nameP, "DisplayMode")) FemonConfig.SetDisplayMode(atoi(valueP)); else if (!strcasecmp(nameP, "Position")) FemonConfig.SetPosition(atoi(valueP)); else if (!strcasecmp(nameP, "Skin")) FemonConfig.SetSkin(atoi(valueP)); else if (!strcasecmp(nameP, "Theme")) FemonConfig.SetTheme(atoi(valueP)); else if (!strcasecmp(nameP, "Downscale")) FemonConfig.SetDownscale(atoi(valueP)); else if (!strcasecmp(nameP, "RedLimit")) FemonConfig.SetRedLimit(atoi(valueP)); else if (!strcasecmp(nameP, "GreenLimit")) FemonConfig.SetGreenLimit(atoi(valueP)); else if (!strcasecmp(nameP, "UpdateInterval")) FemonConfig.SetUpdateInterval(atoi(valueP)); else if (!strcasecmp(nameP, "AnalStream")) FemonConfig.SetAnalyzeStream(atoi(valueP)); else if (!strcasecmp(nameP, "CalcInterval")) FemonConfig.SetCalcInterval(atoi(valueP)); else if (!strcasecmp(nameP, "UseSvdrp")) FemonConfig.SetUseSvdrp(atoi(valueP)); else if (!strcasecmp(nameP, "ServerPort")) FemonConfig.SetSvdrpPort(atoi(valueP)); else if (!strcasecmp(nameP, "ServerIp")) FemonConfig.SetSvdrpIp(valueP); else return false; return true; } bool cPluginFemon::Service(const char *idP, void *dataP) { if (strcmp(idP, "FemonService-v1.0") == 0) { if (dataP) { FemonService_v1_0 *data = reinterpret_cast(dataP); if (!cDevice::ActualDevice()) return false; cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); data->fe_name = getFrontendName(dev); data->fe_status = getFrontendStatus(dev); data->fe_snr = getSNR(dev); data->fe_signal = getSignal(dev); data->fe_ber = getBER(dev); data->fe_unc = getUNC(dev); data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0; data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0; data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0; } return true; } return false; } const char **cPluginFemon::SVDRPHelpPages(void) { static const char *HelpPages[] = { "OPEN\n" " Open femon plugin.", "QUIT\n" " Close femon plugin.", "NEXT\n" " Switch to next possible device.", "PREV\n" " Switch to previous possible device.", "INFO \n" " Print the frontend information.", "NAME \n" " Print the frontend name.", "STAT \n" " Print the frontend status.", "STRG \n" " Print the signal strength.", "QUAL \n" " Print the signal quality.", "SGNL \n" " Print the signal strength from driver.", "SNRA \n" " Print the signal-to-noise ratio from driver.", "BERA \n" " Print the bit error rate.", "UNCB \n" " Print the uncorrected blocks rate.", "VIBR\n" " Print the current video bitrate [Mbit/s].", "AUBR\n" " Print the current audio bitrate [kbit/s].", "DDBR\n" " Print the current dolby bitrate [kbit/s].", "TRAC [ ]\n" " Gets and/or sets used tracing mode.\n", NULL }; return HelpPages; } cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP) { cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); if (strcasecmp(commandP, "TRAC") == 0) { if (optionP && *optionP) FemonConfig.SetTraceMode(strtol(optionP, NULL, 0)); return cString::sprintf("Tracing mode: 0x%04X\n", FemonConfig.GetTraceMode()); } if (*optionP && isnumber(optionP)) { cDvbDevice *dev2 = dynamic_cast(cDevice::GetDevice(int(strtol(optionP, NULL, 10)))); if (dev2) dev = dev2; } if (cReplayControl::NowReplaying() || !dev) { replyCodeP = 550; // Requested action not taken return cString("Cannot open femon plugin while replaying"); } if (strcasecmp(commandP, "OPEN") == 0) { if (!cFemonOsd::Instance()) cRemote::CallPlugin(Name()); return cString("Opening femon plugin"); } else if (strcasecmp(commandP, "QUIT") == 0) { if (cFemonOsd::Instance()) cRemote::Put(kBack); return cString("Closing femon plugin"); } else if (strcasecmp(commandP, "NEXT") == 0) { if (cFemonOsd::Instance()) return cString::sprintf("Switching to next device: %s", cFemonOsd::Instance()->DeviceSwitch(1) ? "ok" : "failed"); else return cString("Cannot switch device"); } else if (strcasecmp(commandP, "PREV") == 0) { if (cFemonOsd::Instance()) return cString::sprintf("Switching to previous device: %s", cFemonOsd::Instance()->DeviceSwitch(-1) ? "ok" : "failed"); else return cString("Cannot switch device"); } else if (strcasecmp(commandP, "INFO") == 0) { return getFrontendInfo(dev); } else if (strcasecmp(commandP, "NAME") == 0) { return getFrontendName(dev); } else if (strcasecmp(commandP, "STAT") == 0) { return getFrontendStatus(dev); } else if (strcasecmp(commandP, "STRG") == 0) { return cString::sprintf("%d on device #%d", dev->SignalStrength(), dev->CardIndex()); } else if (strcasecmp(commandP, "QUAL") == 0) { return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex()); } else if (strcasecmp(commandP, "SGNL") == 0) { int value = getSignal(dev); return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex()); } else if (strcasecmp(commandP, "SNRA") == 0) { int value = getSNR(dev); return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex()); } else if (strcasecmp(commandP, "BERA") == 0) { return cString::sprintf("%08X on device #%d", getBER(dev), dev->CardIndex()); } else if (strcasecmp(commandP, "UNCB") == 0) { return cString::sprintf("%08X on device #%d", getUNC(dev), dev->CardIndex()); } else if (strcasecmp(commandP, "VIBR") == 0) { if (cFemonOsd::Instance()) return cString::sprintf("%s on device #%d", *getBitrateMbits(cFemonOsd::Instance()->GetVideoBitrate()), cDevice::ActualDevice()->CardIndex()); else return cString::sprintf("--- Mbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); } else if (strcasecmp(commandP, "AUBR") == 0) { if (cFemonOsd::Instance()) return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetAudioBitrate()), cDevice::ActualDevice()->CardIndex()); else return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); } else if (strcasecmp(commandP, "DDBR") == 0) { if (cFemonOsd::Instance()) return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetDolbyBitrate()), cDevice::ActualDevice()->CardIndex()); else return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); } return NULL; } VDRPLUGINCREATOR(cPluginFemon); // Don't touch this! femon-2.2.1/h264.h0000644000000000000000000000332412507636100012154 0ustar rootroot/* * h264.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_H264_H #define __FEMON_H264_H #include "video.h" class cFemonH264 { private: enum { NAL_SEI = 0x06, // Supplemental Enhancement Information NAL_SPS = 0x07, // Sequence Parameter Set NAL_AUD = 0x09, // Access Unit Delimiter NAL_END_SEQ = 0x0A // End of Sequence }; typedef struct DAR { eVideoAspectRatio dar; int ratio; } t_DAR; typedef struct SAR { int w; int h; } t_SAR; cFemonVideoIf *videoHandlerM; uint32_t widthM; uint32_t heightM; eVideoAspectRatio aspectRatioM; eVideoFormat formatM; double frameRateM; double bitRateM; eVideoScan scanM; bool cpbDpbDelaysPresentFlagM; bool picStructPresentFlagM; bool frameMbsOnlyFlagM; bool mbAdaptiveFrameFieldFlagM; uint32_t timeOffsetLengthM; void reset(); const uint8_t *nextStartCode(const uint8_t *start, const uint8_t *end); int nalUnescape(uint8_t *dst, const uint8_t *src, int len); int parseSPS(const uint8_t *buf, int len); int parseSEI(const uint8_t *buf, int len); static const t_SAR sarS[]; static const t_DAR darS[]; static const eVideoFormat videoFormatS[]; static const uint8_t seiNumClockTsTableS[9]; public: cFemonH264(cFemonVideoIf *videoHandlerP); virtual ~cFemonH264(); bool processVideo(const uint8_t *bufP, int lenP); }; #endif //__FEMON_H264_H femon-2.2.1/symbol.c0000644000000000000000000002154112507636100012772 0ustar rootroot/* * symbol.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include #include "log.h" #include "tools.h" #include "symbol.h" #include "symbols/stereo.xpm" #include "symbols/monoleft.xpm" #include "symbols/monoright.xpm" #include "symbols/dolbydigital.xpm" #include "symbols/dolbydigital20.xpm" #include "symbols/dolbydigital51.xpm" #include "symbols/mpeg2.xpm" #include "symbols/h264.xpm" #include "symbols/ntsc.xpm" #include "symbols/pal.xpm" #include "symbols/encrypted.xpm" #include "symbols/svdrp.xpm" #include "symbols/lock.xpm" #include "symbols/signal.xpm" #include "symbols/carrier.xpm" #include "symbols/viterbi.xpm" #include "symbols/sync.xpm" #include "symbols/ar11.xpm" #include "symbols/ar169.xpm" #include "symbols/ar2211.xpm" #include "symbols/ar43.xpm" #include "symbols/device.xpm" #include "symbols/zero.xpm" #include "symbols/one.xpm" #include "symbols/two.xpm" #include "symbols/three.xpm" #include "symbols/four.xpm" #include "symbols/five.xpm" #include "symbols/six.xpm" #include "symbols/seven.xpm" #include "symbols/eight.xpm" #include "symbols/format1080.xpm" #include "symbols/format1080i.xpm" #include "symbols/format1080p.xpm" #include "symbols/format720.xpm" #include "symbols/format720i.xpm" #include "symbols/format720p.xpm" #include "symbols/format576.xpm" #include "symbols/format576i.xpm" #include "symbols/format576p.xpm" #include "symbols/format480.xpm" #include "symbols/format480i.xpm" #include "symbols/format480p.xpm" static cBitmap bmOnePixel(1, 1, 1); static cBitmap bmStereo(stereo_xpm); static cBitmap bmMonoLeft(monoleft_xpm); static cBitmap bmMonoRight(monoright_xpm); static cBitmap bmDolbyDigital(dolbydigital_xpm); static cBitmap bmDolbyDigital20(dolbydigital20_xpm); static cBitmap bmDolbyDigital51(dolbydigital51_xpm); static cBitmap bmMpeg2(mpeg2_xpm); static cBitmap bmH264(h264_xpm); static cBitmap bmPal(pal_xpm); static cBitmap bmNtsc(ntsc_xpm); static cBitmap bmEncrypted(encrypted_xpm); static cBitmap bmSvdrp(svdrp_xpm); static cBitmap bmLock(lock_xpm); static cBitmap bmSignal(signal_xpm); static cBitmap bmCarrier(carrier_xpm); static cBitmap bmViterbi(viterbi_xpm); static cBitmap bmSync(sync_xpm); static cBitmap bmAspectRatio11(ar11_xpm); static cBitmap bmAspectRatio169(ar169_xpm); static cBitmap bmAspectRatio2211(ar2211_xpm); static cBitmap bmAspectRatio43(ar43_xpm); static cBitmap bmDevice(device_xpm); static cBitmap bmZero(zero_xpm); static cBitmap bmOne(one_xpm); static cBitmap bmTwo(two_xpm); static cBitmap bmThree(three_xpm); static cBitmap bmFour(four_xpm); static cBitmap bmFive(five_xpm); static cBitmap bmSix(six_xpm); static cBitmap bmSeven(seven_xpm); static cBitmap bmEight(eight_xpm); static cBitmap bmFormat1080(format1080_xpm); static cBitmap bmFormat1080i(format1080i_xpm); static cBitmap bmFormat1080p(format1080p_xpm); static cBitmap bmFormat720(format720_xpm); static cBitmap bmFormat720i(format720i_xpm); static cBitmap bmFormat720p(format720p_xpm); static cBitmap bmFormat576(format576_xpm); static cBitmap bmFormat576i(format576i_xpm); static cBitmap bmFormat576p(format576p_xpm); static cBitmap bmFormat480(format480_xpm); static cBitmap bmFormat480i(format480i_xpm); static cBitmap bmFormat480p(format480p_xpm); cFemonSymbolCache femonSymbols; cFemonSymbolCache::cFemonSymbolCache() : xFactorM(1.0), yFactorM(1.0), antiAliasM(false) { Populate(); } cFemonSymbolCache::~cFemonSymbolCache() { Flush(); } void cFemonSymbolCache::Refresh() { int width, height; double aspect, xfactor, yfactor; cDevice::PrimaryDevice()->GetOsdSize(width, height, aspect); debug1("%s width=%d height=%d", __PRETTY_FUNCTION__, width, height); xfactor = (double)width / DEFAULT_WIDTH; yfactor = (double)height / DEFAULT_HEIGHT; if (!DoubleEqual(xfactor, xFactorM) || !DoubleEqual(yfactor, yFactorM)) { xFactorM = xfactor; yFactorM = yfactor; Populate(); } } bool cFemonSymbolCache::Populate(void) { debug1("%s xFactor=%.02f yFactor=%.02f", __PRETTY_FUNCTION__, xFactorM, yFactorM); if (!DoubleEqual(0.0, xFactorM) || !DoubleEqual(0.0, yFactorM)) { Flush(); // pushing order must follow the enumeration - keep original proportions except for frontend status ones cacheM.Append(bmOnePixel.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ONEPIXEL cacheM.Append(bmStereo.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_STEREO cacheM.Append(bmMonoLeft.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MONO_LEFT cacheM.Append(bmMonoRight.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MONO_RIGHT cacheM.Append(bmDolbyDigital.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD cacheM.Append(bmDolbyDigital20.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD20 cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD51 cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MPEG2 cacheM.Append(bmH264.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_H264 cacheM.Append(bmPal.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_PAL cacheM.Append(bmNtsc.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_NTSC cacheM.Append(bmEncrypted.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ENCRYPTED cacheM.Append(bmSvdrp.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SVDRP cacheM.Append(bmLock.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_LOCK cacheM.Append(bmSignal.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_SIGNAL cacheM.Append(bmCarrier.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_CARRIER cacheM.Append(bmViterbi.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_VITERBI cacheM.Append(bmSync.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_SYNC cacheM.Append(bmAspectRatio11.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_AR_1_1 cacheM.Append(bmAspectRatio169.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_AR_16_9 cacheM.Append(bmAspectRatio2211.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_AR_2_21_1 cacheM.Append(bmAspectRatio43.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_AR_4_3 cacheM.Append(bmDevice.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DEVICE cacheM.Append(bmZero.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ZERO cacheM.Append(bmOne.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ONE cacheM.Append(bmTwo.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_TWO cacheM.Append(bmThree.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_THREE cacheM.Append(bmFour.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FOUR cacheM.Append(bmFive.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FIVE cacheM.Append(bmSix.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SIX cacheM.Append(bmSeven.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SEVEN cacheM.Append(bmEight.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_EIGHT cacheM.Append(bmFormat1080.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080 cacheM.Append(bmFormat1080i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080i cacheM.Append(bmFormat1080p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080p cacheM.Append(bmFormat720.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720 cacheM.Append(bmFormat720i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720i cacheM.Append(bmFormat720p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720p cacheM.Append(bmFormat576.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576 cacheM.Append(bmFormat576i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576i cacheM.Append(bmFormat576p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576p cacheM.Append(bmFormat480.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480 cacheM.Append(bmFormat480i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480i cacheM.Append(bmFormat480p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480p return true; } return false; } bool cFemonSymbolCache::Flush(void) { debug1("%s", __PRETTY_FUNCTION__); for (int i = 0; i < cacheM.Size(); ++i) { cBitmap *bmp = cacheM[i]; DELETENULL(bmp); } cacheM.Clear(); return true; } cBitmap& cFemonSymbolCache::Get(eSymbols symbolP) { cBitmap *bitmapM = cacheM[SYMBOL_ONEPIXEL]; if (symbolP < cacheM.Size()) bitmapM = cacheM[symbolP]; else error("%s (%d) Invalid symbol", __PRETTY_FUNCTION__, symbolP); return *bitmapM; } femon-2.2.1/config.c0000644000000000000000000000741212507636100012733 0ustar rootroot/* * config.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include #include "tools.h" #include "config.h" cFemonConfig FemonConfig; cFemonConfig::cFemonConfig() : traceModeM(eTraceModeNormal), hideMenuM(0), displayModeM(0), skinM(0), themeM(0), positionM(1), downscaleM(0), redLimitM(33), greenLimitM(66), updateIntervalM(5), analyzeStreamM(1), calcIntervalM(20), useSvdrpM(0), svdrpPortM(6419) { SetSvdrpIp("0.0.0.0"); } void cFemonConfig::SetSvdrpIp(const char *strP) { strn0cpy(svdrpIpM, strP, sizeof(svdrpIpM)); } const cFemonTheme FemonTheme[eFemonThemeMaxNumber] = { { // eFemonThemeClassic 4, // bpp 0x7F000000, // clrBackground 0xFFFCFCFC, // clrTitleBackground 0xFF000000, // clrTitleText 0xFFFCC024, // clrActiveText 0xFFFCFCFC, // clrInactiveText 0xFFFC1414, // clrRed 0xFFFCC024, // clrYellow 0xFF24FC24, // clrGreen }, { // eFemonThemeElchi 4, // bpp 0xC8000066, // clrBackground 0xC833AAEE, // clrTitleBackground 0xFF000000, // clrTitleText 0xFFCCBB22, // clrActiveText 0xFFFFFFFF, // clrInactiveText 0xFFFF0000, // clrRed 0xFFFFEE00, // clrYellow 0xFF33CC33, // clrGreen }, { // eFemonThemeSTTNG 4, // bpp 0x7F000000, // clrBackground 0xFFFCC024, // clrTitleBackground 0xFF000000, // clrTitleText 0xFF00FCFC, // clrActiveText 0xFFFCC024, // clrInactiveText 0xFFFC1414, // clrRed 0xFFFCC024, // clrYellow 0xFF24FC24, // clrGreen }, { // eFemonThemeDeepBlue 4, // bpp 0xC80C0C0C, // clrBackground 0xC832557A, // clrTitleBackground 0xFF000000, // clrTitleText 0xFFCE7B00, // clrActiveText 0xFF9A9A9A, // clrInactiveText 0xFF992900, // clrRed 0xFFCE7B00, // clrYellow 0xFF336600, // clrGreen }, { // eFemonThemeMoronimo 4, // bpp 0xDF294A6B, // clrBackground 0xDF3E5578, // clrTitleBackground 0xFF9BBAD7, // clrTitleText 0xFFCE7B00, // clrActiveText 0xFF9A9A9A, // clrInactiveText 0xFF992900, // clrRed 0xFFCE7B00, // clrYellow 0xFF336600, // clrGreen }, { // eFemonThemeEnigma 4, // bpp 0xB8DEE5FA, // clrBackground 0xB84158BC, // clrTitleBackground 0xFFFFFFFF, // clrTitleText 0xFF000000, // clrActiveText 0xFF000000, // clrInactiveText 0xB8C40000, // clrRed 0xB8C4C400, // clrYellow 0xB800C400, // clrGreen }, { // eFemonThemeEgalsTry 4, // bpp 0xCA2B1B9E, // clrBackground 0xDFBEBAC3, // clrTitleBackground 0xFF280249, // clrTitleText 0xFFD4D7DB, // clrActiveText 0xDFCFCFCF, // clrInactiveText 0xFFFF0000, // clrRed 0xFFFCC024, // clrYellow 0xFF20980B, // clrGreen }, { // eFemonThemeDuotone 2, // bpp 0x7F000000, // clrBackground 0xFFFCFCFC, // clrTitleBackground 0x7F000000, // clrTitleText 0xFFFCFCFC, // clrActiveText 0xFFFCFCFC, // clrInactiveText 0xFFFC1414, // clrRed 0xFFFCFCFC, // clrYellow 0xFFFCFCFC, // clrGreen }, { // eFemonThemeSilverGreen 4, // bpp 0xD9526470, // clrBackground 0xD9293841, // clrTitleBackground 0xFFB3BDCA, // clrTitleText 0xFFCE7B00, // clrActiveText 0xFFB3BDCA, // clrInactiveText 0xFF992900, // clrRed 0xFFCE7B00, // clrYellow 0xFF336600, // clrGreen }, { // eFemonThemePearlHD 4, // bpp 0x90000000, // clrBackground 0xCC000000, // clrTitleBackground 0xFFBEBEBE, // clrTitleText 0xFF4E78B1, // clrActiveText 0xFFBEBEBE, // clrInactiveText 0xAAFF0000, // clrRed 0xAAF8F800, // clrYellow 0x6000ff00, // clrGreen }, }; femon-2.2.1/femonservice.h0000644000000000000000000000075112507636100014157 0ustar rootroot/* * Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMONSERVICE_H #define __FEMONSERVICE_H #include struct FemonService_v1_0 { cString fe_name; cString fe_status; uint16_t fe_snr; uint16_t fe_signal; uint32_t fe_ber; uint32_t fe_unc; double video_bitrate; double audio_bitrate; double dolby_bitrate; }; #endif //__FEMONSERVICE_H femon-2.2.1/setup.c0000644000000000000000000001375512507636100012635 0ustar rootroot/* * setup.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include #include "config.h" #include "log.h" #include "tools.h" #include "setup.h" cMenuFemonSetup::cMenuFemonSetup() : hideMenuM(FemonConfig.GetHideMenu()), displayModeM(FemonConfig.GetDisplayMode()), skinM(FemonConfig.GetSkin()), themeM(FemonConfig.GetTheme()), positionM(FemonConfig.GetPosition()), downscaleM(FemonConfig.GetDownscale()), redLimitM(FemonConfig.GetRedLimit()), greenLimitM(FemonConfig.GetGreenLimit()), updateIntervalM(FemonConfig.GetUpdateInterval()), analyzeStreamM(FemonConfig.GetAnalyzeStream()), calcIntervalM(FemonConfig.GetCalcInterval()), useSvdrpM(FemonConfig.GetUseSvdrp()), svdrpPortM(FemonConfig.GetSvdrpPort()) { debug1("%s", __PRETTY_FUNCTION__); strn0cpy(svdrpIpM, FemonConfig.GetSvdrpIp(), sizeof(svdrpIpM)); dispModesM[eFemonModeBasic] = tr("basic"); dispModesM[eFemonModeTransponder] = tr("transponder"); dispModesM[eFemonModeStream] = tr("stream"); dispModesM[eFemonModeAC3] = tr("AC-3"); skinsM[eFemonSkinClassic] = tr("Classic"); skinsM[eFemonSkinElchi] = tr("Elchi"); themesM[eFemonThemeClassic] = tr("Classic"); themesM[eFemonThemeElchi] = tr("Elchi"); themesM[eFemonThemeSTTNG] = tr("ST:TNG"); themesM[eFemonThemeDeepBlue] = tr("DeepBlue"); themesM[eFemonThemeMoronimo] = tr("Moronimo"); themesM[eFemonThemeEnigma] = tr("Enigma"); themesM[eFemonThemeEgalsTry] = tr("EgalsTry"); themesM[eFemonThemeDuotone] = tr("Duotone"); themesM[eFemonThemeSilverGreen] = tr("SilverGreen"); themesM[eFemonThemePearlHD] = tr("PearlHD"); SetMenuCategory(mcSetupPlugins); Setup(); } void cMenuFemonSetup::Setup(void) { int current = Current(); Clear(); helpM.Clear(); Add(new cMenuEditBoolItem(tr("Hide main menu entry"), &hideMenuM)); helpM.Append(tr("Define whether the main menu entry is hidden.")); Add(new cMenuEditStraItem(tr("Default display mode"), &displayModeM, eFemonModeMaxNumber, dispModesM)); helpM.Append(tr("Define the default display mode at startup.")); Add(new cMenuEditStraItem(trVDR("Setup.OSD$Skin"), &skinM, eFemonSkinMaxNumber, skinsM)); helpM.Append(tr("Define the used OSD skin.")); Add(new cMenuEditStraItem(trVDR("Setup.OSD$Theme"), &themeM, eFemonThemeMaxNumber, themesM)); helpM.Append(tr("Define the used OSD theme.")); Add(new cMenuEditBoolItem(tr("Position"), &positionM, trVDR("bottom"), trVDR("top"))); helpM.Append(tr("Define the position of OSD.")); Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &downscaleM, 0, 20)); helpM.Append(tr("Define the downscale ratio for OSD size.")); Add(new cMenuEditIntItem(tr("Red limit [%]"), &redLimitM, 1, 50)); helpM.Append(tr("Define a limit for red bar, which is used to indicate a bad signal.")); Add(new cMenuEditIntItem(tr("Green limit [%]"), &greenLimitM, 51, 100)); helpM.Append(tr("Define a limit for green bar, which is used to indicate a good signal.")); Add(new cMenuEditIntItem(tr("OSD update interval [0.1s]"), &updateIntervalM, 1, 100)); helpM.Append(tr("Define an interval for OSD updates. The smaller interval generates higher CPU load.")); Add(new cMenuEditBoolItem(tr("Analyze stream"), &analyzeStreamM)); helpM.Append(tr("Define whether the DVB stream is analyzed and bitrates calculated.")); if (analyzeStreamM) { Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &calcIntervalM, 1, 100)); helpM.Append(tr("Define an interval for calculation. The bigger interval generates more stable values.")); } Add(new cMenuEditBoolItem(tr("Use SVDRP service"), &useSvdrpM)); helpM.Append(tr("Define whether the SVDRP service is used in client/server setups.")); if (useSvdrpM) { Add(new cMenuEditIntItem(tr("SVDRP service port"), &svdrpPortM, 1, 65535)); helpM.Append(tr("Define the port number of SVDRP service.")); Add(new cMenuEditStrItem(tr("SVDRP service IP"), svdrpIpM, sizeof(svdrpIpM), ".1234567890")); helpM.Append(tr("Define the IP address of SVDRP service.")); } SetCurrent(Get(current)); Display(); } void cMenuFemonSetup::Store(void) { debug1("%s", __PRETTY_FUNCTION__); // Store values into setup.conf SetupStore("HideMenu", hideMenuM); SetupStore("DisplayMode", displayModeM); SetupStore("Skin", skinM); SetupStore("Theme", themeM); SetupStore("Position", positionM); SetupStore("Downscale", downscaleM); SetupStore("RedLimit", redLimitM); SetupStore("GreenLimit", greenLimitM); SetupStore("UpdateInterval", updateIntervalM); SetupStore("AnalStream", analyzeStreamM); SetupStore("CalcInterval", calcIntervalM); SetupStore("UseSvdrp", useSvdrpM); SetupStore("ServerPort", svdrpPortM); SetupStore("ServerIp", svdrpIpM); // Update global config FemonConfig.SetHideMenu(hideMenuM); FemonConfig.SetDisplayMode(displayModeM); FemonConfig.SetSkin(skinM); FemonConfig.SetTheme(themeM); FemonConfig.SetPosition(positionM); FemonConfig.SetDownscale(downscaleM); FemonConfig.SetRedLimit(redLimitM); FemonConfig.SetGreenLimit(greenLimitM); FemonConfig.SetUpdateInterval(updateIntervalM); FemonConfig.SetAnalyzeStream(analyzeStreamM); FemonConfig.SetCalcInterval(calcIntervalM); FemonConfig.SetUseSvdrp(useSvdrpM); FemonConfig.SetSvdrpPort(svdrpPortM); FemonConfig.SetSvdrpIp(svdrpIpM); } eOSState cMenuFemonSetup::ProcessKey(eKeys keyP) { int oldUseSvdrp = useSvdrpM; int oldAnalyzeStream = analyzeStreamM; eOSState state = cMenuSetupPage::ProcessKey(keyP); if (keyP != kNone && (analyzeStreamM != oldAnalyzeStream || useSvdrpM != oldUseSvdrp)) Setup(); if ((keyP == kInfo) && (state == osUnknown) && (Current() < helpM.Size())) return AddSubMenu(new cMenuText(cString::sprintf("%s - %s '%s'", tr("Help"), trVDR("Plugin"), PLUGIN_NAME_I18N), helpM[Current()])); return state; } femon-2.2.1/tools.h0000644000000000000000000000525212507636100012633 0ustar rootroot/* * tools.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_COMMON_H #define __FEMON_COMMON_H #include #include #include #include #include #define ELEMENTS(x) (sizeof(x) / sizeof(x[0])) #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" #define SATIP_DEVICE "SAT>IP" cDvbDevice *getDvbDevice(cDevice* deviceP); cString getFrontendInfo(cDvbDevice *deviceP); cString getFrontendName(cDvbDevice *deviceP); cString getFrontendStatus(cDvbDevice *deviceP); uint16_t getSNR(cDvbDevice *deviceP); uint16_t getSignal(cDvbDevice *deviceP); uint32_t getBER(cDvbDevice *deviceP); uint32_t getUNC(cDvbDevice *deviceP); cString getApids(const cChannel *channelP); cString getDpids(const cChannel *channelP); cString getSpids(const cChannel *channelP); cString getCAids(const cChannel *channelP); cString getVideoStream(int valueP); cString getVideoCodec(int valueP); cString getAudioStream(int valueP, const cChannel *channelP); cString getAudioCodec(int valueP); cString getAudioChannelMode(int valueP); cString getCoderate(int valueP); cString getTransmission(int valueP); cString getBandwidth(int valueP); cString getInversion(int valueP); cString getHierarchy(int valueP); cString getGuard(int valueP); cString getModulation(int valueP); cString getTerrestrialSystem(int valueP); cString getSatelliteSystem(int valueP); cString getRollOff(int valueP); cString getPilot(int valueP); cString getResolution(int widthP, int heightP, int scanP); cString getAspectRatio(int valueP); cString getVideoFormat(int valueP); cString getFrameRate(double valueP); cString getAC3Stream(int valueP, const cChannel *channelP); cString getAC3BitStreamMode(int valueP, int codingP); cString getAC3AudioCodingMode(int valueP, int streamP); cString getAC3CenterMixLevel(int valueP); cString getAC3SurroundMixLevel(int valueP); cString getAC3DolbySurroundMode(int valueP); cString getAC3DialogLevel(int valueP); cString getFrequencyMHz(int valueP); cString getAudioSamplingFreq(int valueP); cString getAudioBitrate(double valueP, double streamP); cString getVideoBitrate(double valueP, double streamP); cString getBitrateMbits(double valueP); cString getBitrateKbits(double valueP); class cFemonBitStream : public cBitStream { public: cFemonBitStream(const uint8_t *dataP, const int lengthP) : cBitStream(dataP, lengthP) {} uint32_t GetUeGolomb(); int32_t GetSeGolomb(); void SkipGolomb(); void SkipUeGolomb() { SkipGolomb(); } void SkipSeGolomb() { SkipGolomb(); } }; #endif // __FEMON_COMMON_H femon-2.2.1/Makefile0000644000000000000000000000671312507636100012765 0ustar rootroot# # Makefile for Frontend Status Monitor plugin # # The official name of this plugin. # This name will be used in the '-P...' option of VDR to load the plugin. # By default the main source file also carries this name. PLUGIN = femon ### The version number of this plugin (taken from the main source file): VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') GITTAG = $(shell git describe --always 2>/dev/null) ### The directory environment: # Use package data if installed...otherwise assume we're under the VDR source directory: PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr)) LIBDIR = $(call PKGCFG,libdir) LOCDIR = $(call PKGCFG,locdir) PLGCFG = $(call PKGCFG,plgcfg) # TMPDIR ?= /tmp ### The compiler options: export CFLAGS = $(call PKGCFG,cflags) export CXXFLAGS = $(call PKGCFG,cxxflags) STRIP ?= /bin/true ### The version number of VDR's plugin API: APIVERSION = $(call PKGCFG,apiversion) ### Allow user defined options to overwrite defaults: -include $(PLGCFG) ### The name of the distribution archive: ARCHIVE = $(PLUGIN)-$(VERSION) PACKAGE = vdr-$(ARCHIVE) ### The name of the shared object file: SOFILE = libvdr-$(PLUGIN).so ### Includes and Defines (add further entries here): INCLUDES += DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' ifneq ($(strip $(GITTAG)),) DEFINES += -DGITVERSION='"-GIT-$(GITTAG)"' endif .PHONY: all all-redirect all-redirect: all ### The object files (add further files here): OBJS = $(PLUGIN).o aac.o ac3.o config.o h264.o latm.o mpeg.o osd.o receiver.o setup.o symbol.o tools.o ### The main target: all: $(SOFILE) i18n ### Implicit rules: %.o: %.c $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< ### Dependencies: MAKEDEP = $(CXX) -MM -MG DEPFILE = .dependencies $(DEPFILE): Makefile @$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ -include $(DEPFILE) ### Internationalization (I18N): PODIR = po I18Npo = $(wildcard $(PODIR)/*.po) I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file)))) I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file)))))) I18Npot = $(PODIR)/$(PLUGIN).pot %.mo: %.po msgfmt -c -o $@ $< $(I18Npot): $(wildcard *.c) xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='' -o $@ `ls $^` %.po: $(I18Npot) msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< @touch $@ $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo install -D -m644 $< $@ .PHONY: i18n i18n: $(I18Nmo) $(I18Npot) install-i18n: $(I18Nmsgs) ### Targets: $(SOFILE): $(OBJS) $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ @$(STRIP) $@ install-lib: $(SOFILE) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install: install-lib install-i18n dist: $(I18Npo) clean @-rm -rf $(TMPDIR)/$(ARCHIVE) @mkdir $(TMPDIR)/$(ARCHIVE) @cp -a * $(TMPDIR)/$(ARCHIVE) @tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE) @echo Distribution package created as $(PACKAGE).tgz clean: @-rm -f $(PODIR)/*.mo $(PODIR)/*.pot @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ .PHONY: cppcheck cppcheck: @cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c) femon-2.2.1/mpeg.c0000644000000000000000000002061512507636100012416 0ustar rootroot/* * mpeg.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "tools.h" #include "mpeg.h" #define IS_EXTENSION_START(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == 0xB5)) int cFemonMPEG::bitrateS[2][3][16] = { { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, // MPEG-2 Layer I {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, // MPEG-2 Layer II/III {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1} // MPEG-2 Layer II/III }, { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1}, // MPEG-1 Layer I {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1}, // MPEG-1 Layer II {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1} // MPEG-1 Layer III } }; int cFemonMPEG::sampleRateS[2][4] = { {22050, 24000, 16000, -1}, // MPEG-2 {44100, 48000, 32000, -1} // MPEG-1 }; eAudioCodec cFemonMPEG::formatS[2][4] = { {AUDIO_CODEC_MPEG2_I, AUDIO_CODEC_MPEG2_II, AUDIO_CODEC_MPEG2_III, AUDIO_CODEC_UNKNOWN}, // MPEG-2 {AUDIO_CODEC_MPEG1_I, AUDIO_CODEC_MPEG1_II, AUDIO_CODEC_MPEG1_III, AUDIO_CODEC_UNKNOWN} // MPEG-1 }; cFemonMPEG::cFemonMPEG(cFemonVideoIf *videoHandlerP, cFemonAudioIf *audioHandlerP) : videoHandlerM(videoHandlerP), audioHandlerM(audioHandlerP) { } cFemonMPEG::~cFemonMPEG() { } bool cFemonMPEG::processAudio(const uint8_t *bufP, int lenP) { cFemonBitStream bs(bufP, lenP * 8); if (!audioHandlerM) return false; // skip PES header if (!PesLongEnough(lenP)) return false; bs.SkipBits(8 * PesPayloadOffset(bufP)); // MPEG audio detection if (bs.GetBits(12) != 0xFFF) // syncword return false; int id = bs.GetBit(); // id: MPEG-2=0, MPEG-1=1 int layer = 3 - bs.GetBits(2); // layer: I=11, II=10, III=01 bs.SkipBit(); // protection bit int bit_rate_index = bs.GetBits(4); // bitrate index int sampling_frequency = bs.GetBits(2); // sampling frequency bs.SkipBit(); // padding bit bs.SkipBit(); // private pid int mode = bs.GetBits(2); // mode audioHandlerM->SetAudioCodec(formatS[id][layer]); switch (mode) { case 0: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO); break; case 1: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO); break; case 2: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL); break; case 3: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE); break; default: audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID); break; } switch (bit_rate_index) { case 0: audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE); break; case 0xF: audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED); break; default: audioHandlerM->SetAudioBitrate(1000 * bitrateS[id][layer][bit_rate_index]); break; } switch (sampling_frequency) { case 3: audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED); break; default: audioHandlerM->SetAudioSamplingFrequency(sampleRateS[id][sampling_frequency]); break; } return true; } bool cFemonMPEG::processVideo(const uint8_t *bufP, int lenP) { cFemonBitStream bs(bufP, lenP * 8); if (!videoHandlerM) return false; // skip PES header if (!PesLongEnough(lenP)) return false; bs.SkipBits(8 * PesPayloadOffset(bufP)); // MPEG-2 video detection, search for start code if (bs.GetBits(32) != 0x000001B3) // sequence header return false; int scan = VIDEO_SCAN_UNKNOWN; int format = VIDEO_FORMAT_UNKNOWN; int aspect = VIDEO_ASPECT_RATIO_RESERVED; int horizontal_size = bs.GetBits(12); // horizontal size value int vertical_size = bs.GetBits(12); // vertical size value switch (bs.GetBits(4)) { // aspect ratio information case 1: aspect = VIDEO_ASPECT_RATIO_1_1; break; case 2: aspect = VIDEO_ASPECT_RATIO_4_3; break; case 3: aspect = VIDEO_ASPECT_RATIO_16_9; break; case 4: aspect = VIDEO_ASPECT_RATIO_2_21_1; break; case 5 ... 15: default: aspect = VIDEO_ASPECT_RATIO_RESERVED; break; } double frame_rate = 0; switch (bs.GetBits(4)) { // frame rate code case 1: frame_rate = 24000 / 1001.0; format = VIDEO_FORMAT_UNKNOWN; break; case 2: frame_rate = 24.0; format = VIDEO_FORMAT_UNKNOWN; break; case 3: frame_rate = 25.0; format = VIDEO_FORMAT_PAL; break; case 4: frame_rate = 30000 / 1001.0; format = VIDEO_FORMAT_NTSC; break; case 5: frame_rate = 30.0; format = VIDEO_FORMAT_NTSC; break; case 6: frame_rate = 50.0; format = VIDEO_FORMAT_PAL; break; case 7: frame_rate = 60.0; format = VIDEO_FORMAT_NTSC; break; case 8: frame_rate = 60000 / 1001.0; format = VIDEO_FORMAT_NTSC; break; case 9 ... 15: default: frame_rate = 0; format = VIDEO_FORMAT_UNKNOWN; break; } int bit_rate = bs.GetBits(18); // bit rate value bs.SkipBit(); // marker bit bs.SkipBits(10); // vbv buffer size value bs.SkipBit(); // constrained parameters value if (bs.GetBit()) // load intra quantizer matrix bs.SkipBits(8 * 64); // intra quantizer matrix if (bs.GetBit()) // load non-intra quantizer matrix bs.SkipBits(8 * 64); // non-intra quantizer matrix if (bs.GetBits(32) != 0x000001B5) { // extension start bs.SkipBits(4); // extension start code identifier bs.SkipBits(8); // profile and level indicator scan = bs.GetBit() ? VIDEO_SCAN_PROGRESSIVE : VIDEO_SCAN_INTERLACED; // progressive sequence bs.SkipBits(2); // chroma format horizontal_size |= (bs.GetBits(2) << 12); // horizontal size extension vertical_size |= (bs.GetBits(2) << 12); // vertical size extension bit_rate |= (bs.GetBits(12) << 18); // bit rate extension bs.SkipBit(); // marker bit bs.SkipBits(8); // vpv buffer size extension bs.SkipBit(); // low delay bs.SkipBits(2); // frame rate extension n bs.SkipBits(5); // frame rate extension d if ((bs.GetBits(32) != 0x000001B5) && // extension start code (bs.GetBits(4) == 0x0010)) { // sequence display extension id switch (bs.GetBits(3)) { // video format case 0x000: format = VIDEO_FORMAT_COMPONENT; break; case 0x001: format = VIDEO_FORMAT_PAL; break; case 0x010: format = VIDEO_FORMAT_NTSC; break; case 0x011: format = VIDEO_FORMAT_SECAM; break; case 0x100: format = VIDEO_FORMAT_MAC; break; case 0x101: format = VIDEO_FORMAT_UNKNOWN; break; case 0x110: case 0x111: format = VIDEO_FORMAT_RESERVED; break; default: format = VIDEO_FORMAT_INVALID; break; } } } videoHandlerM->SetVideoCodec(VIDEO_CODEC_MPEG2); videoHandlerM->SetVideoSize(horizontal_size, vertical_size); videoHandlerM->SetVideoBitrate(400.0 * (double)(bit_rate)); videoHandlerM->SetVideoFramerate(frame_rate); videoHandlerM->SetVideoScan(eVideoScan(scan)); videoHandlerM->SetVideoAspectRatio(eVideoAspectRatio(aspect)); videoHandlerM->SetVideoFormat(eVideoFormat(format)); return true; } femon-2.2.1/iptvservice.h0000644000000000000000000000056612507636100014041 0ustar rootroot/* * iptvservice.h: IPTV plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __IPTVSERVICE_H #define __IPTVSERVICE_H #include #define stIptv ('I' << 24) struct IptvService_v1_0 { unsigned int cardIndex; cString protocol; cString bitrate; }; #endif //__IPTVSERVICE_H femon-2.2.1/latm.h0000644000000000000000000000077612507636100012436 0ustar rootroot/* * latm.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_LATM_H #define __FEMON_LATM_H #include "audio.h" class cFemonLATM { private: cFemonAudioIf *audioHandlerM; static int bitrateS[3][16]; static int sampleRateS[4]; public: cFemonLATM(cFemonAudioIf *audioHandlerP); virtual ~cFemonLATM(); bool processAudio(const uint8_t *bufP, int lenP); }; #endif //__FEMON_LATM_H femon-2.2.1/symbol.h0000644000000000000000000000327012507636100012776 0ustar rootroot/* * symbol.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_SYMBOL_H #define __FEMON_SYMBOL_H #include #include enum eSymbols { SYMBOL_ONEPIXEL, SYMBOL_STEREO, SYMBOL_MONO_LEFT, SYMBOL_MONO_RIGHT, SYMBOL_DD, SYMBOL_DD20, SYMBOL_DD51, SYMBOL_MPEG2, SYMBOL_H264, SYMBOL_PAL, SYMBOL_NTSC, SYMBOL_ENCRYPTED, SYMBOL_SVDRP, SYMBOL_LOCK, SYMBOL_SIGNAL, SYMBOL_CARRIER, SYMBOL_VITERBI, SYMBOL_SYNC, SYMBOL_AR_1_1, SYMBOL_AR_16_9, SYMBOL_AR_2_21_1, SYMBOL_AR_4_3, SYMBOL_DEVICE, SYMBOL_ZERO, SYMBOL_ONE, SYMBOL_TWO, SYMBOL_THREE, SYMBOL_FOUR, SYMBOL_FIVE, SYMBOL_SIX, SYMBOL_SEVEN, SYMBOL_EIGHT, SYMBOL_FORMAT_1080, SYMBOL_FORMAT_1080i, SYMBOL_FORMAT_1080p, SYMBOL_FORMAT_720, SYMBOL_FORMAT_720i, SYMBOL_FORMAT_720p, SYMBOL_FORMAT_576, SYMBOL_FORMAT_576i, SYMBOL_FORMAT_576p, SYMBOL_FORMAT_480, SYMBOL_FORMAT_480i, SYMBOL_FORMAT_480p, SYMBOL_MAX_COUNT }; class cFemonSymbolCache { private: enum { DEFAULT_SPACING = 5, DEFAULT_ROUNDING = 10, DEFAULT_HEIGHT = 576, DEFAULT_WIDTH = 720 }; double xFactorM; double yFactorM; bool antiAliasM; cVector cacheM; bool Populate(void); bool Flush(void); public: cFemonSymbolCache(); ~cFemonSymbolCache(); void Refresh(); cBitmap& Get(eSymbols symbolP); int GetSpacing() { return int(yFactorM * cFemonSymbolCache::DEFAULT_SPACING); } int GetRounding() { return int(yFactorM * cFemonSymbolCache::DEFAULT_ROUNDING); } }; extern cFemonSymbolCache femonSymbols; #endif // __FEMON_SYMBOL_H femon-2.2.1/HISTORY0000644000000000000000000003166712507636100012417 0ustar rootroot=================================== VDR Plugin 'femon' Revision History =================================== 2004-02-15: Version 0.0.1 - Initial revision. 2004-02-23: Version 0.0.1b - Fixed cThread initialization to work under vdr-1.2.6. 2004-02-26: Version 0.0.2 - Added preliminary video (VPID) and audio (APID1) bitrate calculations. 2004-02-27: Version 0.0.2b - Some minor cosmetic changes. 2004-02-28: Version 0.0.2c - Translation only update: Fixed 'Deutsch' (Thanks to Olaf Henkel @ VDRPortal). Added 'Italiano' (Thanks to Sean Carlos). 2004-03-03: Version 0.0.3 - Redesigned the user interface. - Transponder information is now available in advanced display mode: Press 'OK' key to switch between the simple and the advanced display mode. - Moved bitrate calculation to it's own thread for improved accurancy. 2004-03-07: Version 0.0.3a - Fixed frequency, guard and bandwidth units in transponder information. - Added Apid2, Dpid1, Dpid2 information. - Added option to write signal information into system log. 2004-03-16: Version 0.0.3b - Fixed channel toggling with '0' key. - Bitrate calculation thread is now canceled immediately to speed up channel switching. 2004-04-04: Version 0.0.3c - Fixed minor bitrate calculation errors. - Added Russian translation (Thanks to Vyacheslav Dikonov). 2004-05-31: Version 0.0.4 - Backported "stream information" feature (from version 0.1.1). 2004-06-06: Version 0.0.5 - Backported changes and fixes from version 0.1.2. 2004-06-11: Version 0.0.6 - Backported the "AC3 Stream Information" feature from version 0.1.3. 2004-09-11: Version 0.0.7 - Backported changes and fixes from version 0.1.6. =================================== VDR Plugin 'femon' Revision History =================================== 2004-05-18: Version 0.1.0 - Updated for vdr-1.3.7 and removed compability with older versions. 2004-05-30: Version 0.1.1 - Added "Stream Information" display mode. Toggle between different modes with 'OK' key: .-> basic -> transponder -> stream -. `-----------------------------------' - Added missing german translations (Thanks to Peter Marquardt). 2004-06-06: Version 0.1.2 - Fixed the channel switch bug (reported by Stefan Lucke). - Nid/Tid/Rid are now included in translations. - Added video format and aspect ratio symbols into status window. 2004-06-11: Version 0.1.3 - Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch). 2004-06-24: Version 0.1.4 - Added some new symbols and beautified the old ones. - Added audio track selection feature. - Added preliminary device switching feature (disabled at the moment). 2004-08-18: Version 0.1.5 - Fixed OSDSTATUSWIN_XC define. - Added preliminary NTSC support (make NTSC_SYSTEM=1 plugins). - Fixed "Setup/OSD/Use Small Fonts" bug (Thanks to Winni for reporting this one). - Added patches directory: CA system names by Lauri Tischler. 2004-09-11: Version 0.1.6 - Yet Another Minor Release. - Integrated the CA system names patch: "Setup / Show CA System". 2004-11-28: Version 0.1.7 - Updated for vdr-1.3.17. - Fixed receiver related crash (Thanks to Marco Schluessler). 2005-01-15: Version 0.7.7 - Updated for vdr-1.3.18. - Added DEBUG mode (make DEBUG=1 plugins). - OSD height is now user configurable. - Added audio channel selection into Yellow key. 2005-01-23: Version 0.7.9 - Some minor cosmetic fixes. 2005-01-23: Version 0.8.0 - Updated for vdr-1.3.19. 2005-01-24: Version 0.8.1 - Added Estonian translations (Thanks to Arthur Konovalov). 2005-02-24: Version 0.8.5 - Updated for vdr-1.3.21. - Minor modification for DEBUG mode. - Added preliminary support for themes and some GUI tweaks. - Added horizontal offset setup option. 2005-02-26: Version 0.8.6 - Horizontal offset setup option should be functional now. 2005-04-01: Version 0.8.7 - Default make target is now all. - Fixed the access rights of symbols subdirectory (Thanks to Harri Kukkonen). - Added a new theme: Moronimo (Thanks to Morone). 2005-04-02: Version 0.8.8 - Cleaned up Finnish translations (Thanks to Ville Skyttä). 2005-04-04: Version 0.8.9 - Updated Estonian translations (Thanks to Arthur Konovalov). - Added the missing german translations (Thanks to #vdr-portal). 2005-05-20: Version 0.9.0 - Renamed compiling switches ('DEBUG' to 'FEMON_DEBUG' and 'NTSC_SYSTEM' to 'FEMON_NTSC'). - Enabled preliminary support for the device switching. 2005-07-23: Version 0.9.1 - Fixed AC3-info flickering (Thanks to Pasi Juppo for reporting this one). - Added "Analog" type CA system. - Plugin is now stripped by default. 2005-08-15: Version 0.9.2 - Threads updated for vdr-1.3.29. 2005-08-28: Version 0.9.3 - Updated for vdr-1.3.31. - Added preliminary svdrp and service support. 2005-10-04: Version 0.9.4 - Updated for vdr-1.3.34. - Added Enigma theme (Thanks to Rolf Hoverath). - Added EgalsTry theme (Thanks to Uwe Hanke). - Added option to disable rounded corners. 2005-11-13: Version 0.9.5 - Updated for vdr-1.3.36. - Added French translation (Thanks to Nicolas Huillard). - Enabled bitrate commands via SVDRP. - Added new SVDRP commands. - Modified femon service without incrementing version number. - Added "Duotone" theme for 2bpp on screen displays. - Fixed crash bug in femonreceiver. - Fixed setup page bug (Thanks to Thomas Günther for reporting this one). 2006-01-25: Version 0.9.6 - Updated for vdr-1.3.40. - Fixed a translation bug (Thanks to Antti Hartikainen). - Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this one). - Fixed EgalsTry theme (Thanks to Uwe Hanke). 2006-02-06: Version 0.9.7 - Updated for vdr-1.3.42. - Added "SilverGreen" theme (Thanks to Rififi77 @ VDRPortal). 2006-03-08: Version 0.9.8 - Updated for vdr-1.3.44. - Minor Makefile changes. - Made all symbol data 'const'. - Added spanish translation (Thanks to Luis Palacios). 2006-04-20: Version 0.9.9 - Updated for vdr-1.3.47. 2006-04-23: Version 0.9.10 - Added STRIP option for Makefile (Thanks to Ville Skyttä). - Modified APIVERSION code in Makefile. 2006-04-30: Version 1.0.0 - Updated for vdr-1.4.0. - Modified APIVERSION code in Makefile. - Updated German translation (Thanks to Andreas Brachold). 2006-06-06: Version 1.0.1 - Fixed device switching priority (Thanks to Andreas Brugger). - Fixed device switching back to the primary device. 2006-09-17: Version 1.1.0 - Added support for svdrpservice plugin (Thanks to Frank Schmirler). - Added INFO SVDRP command (partially based on patch by Herbert Pötzl). - Removed system log option - use SVDRP instead. - Added --remove-destination to the 'cp' command in Makefile. 2007-01-08: Version 1.1.1 - Updated for vdr-1.5.0. 2007-05-01: Version 1.1.2 - Fixed opening while replaying (Thanks to Antti Seppälä for reporting this one). 2007-05-15: Version 1.1.3 - Fixed a race condition in cFemonReceiver (Thanks to Reinhard Nissl). 2007-10-14: Version 1.1.4 - Backported from 1.2.2. 2008-01-20: Version 1.1.5 - Updated Italian translation (Thanks to Diego Pierotto). - Added '-Wno-parentheses' to the compiler options. 2007-08-14: Version 1.2.0 - Updated for vdr-1.5.7. 2007-08-19: Version 1.2.1 - Updated for vdr-1.5.8. 2007-10-14: Version 1.2.2 - Added Spids support. - Minor OSD layout changes. 2008-01-20: Version 1.2.3 - Updated Italian translation (Thanks to Diego Pierotto). - Added '-Wno-parentheses' to the compiler options. - Mapped 'kInfo' as help key in setup menu. 2008-02-18: Version 1.2.4 - Replaced asprintf with cString. - Updated French translation (Thanks to Michaël Nival). - Fixed service call with null data. - Added setup option to use a single 8 bpp OSD area. 2008-03-27: Version 1.6.0 - Updated for vdr-1.6.0. - Updated Italian translation (Thanks to Diego Pierotto). - Added ST:TNG theme (Thanks to Fabian Förg). 2008-06-20: Version 1.6.1 - Updated Italian translation (Thanks to Diego Pierotto). - Fixed a crash if no channel available (Thanks to Winfried Köhler). 2008-10-12: Version 1.6.2 - Converted HISTORY and fi_FI.po to UTF-8. - Optimized receiver and OSD thread termination. 2008-11-09: Version 1.6.3 - Added initial support for H.264 and HE-AAC. - Fixed detection of false positives in audio/video streams. - Refactored source code. 2008-11-30: Version 1.6.4 - Added new helper functions. - Updated Italian translation (Thanks to Diego Pierotto). - Fixed a memory leak. - Added a check for the minimum OSD height. - Replaced "Use single area (8bpp)" option with VDR's "Setup/OSD/Anti-alias". - Removed the FEMON_NTSC option. - Fixed a deadlock in cFemonReceiver (Thanks to Antti Seppälä for reporting this one). 2008-12-16: Version 1.6.5 - Backported from 1.7.0. 2009-01-06: Version 1.6.6 - Backported from 1.7.1. 2009-06-18: Version 1.6.7 - Backported from 1.7.2. =================================== VDR Plugin 'femon' Revision History =================================== 2008-12-16: Version 1.7.0 - Updated for vdr-1.7.2. - Added whitespace cleanups. - Changed info window to use the channel source instead of the frontend type. - Removed the "Show CA system" setup option. 2009-01-06: Version 1.7.1 - Fixed closing of frontend file handles (Thanks to Brendon Higgins for reporting this one). 2009-06-18: Version 1.7.2 - Cleaned up compilation warnings. - Fixed font handling to be thread-safe. 2009-08-29: Version 1.7.3 - Removed OSD offset and height options. - Added PES assembler. - Added bitstream parsers for all codecs. 2009-09-04: Version 1.7.4 - Fixed H.264 bitstream parser. - Added a mutex to receiver class. - Added 1080/720/576/480 format symbols into status window. 2009-10-01: Version 1.7.5 - Changed H.264 parser to show display aspect ratio. - Removed error logging from unimplemented ioctl functions. - Removed bitstream parsing from Receive() method. - Added Chinese translation (Thanks to NanFeng). 2010-02-01: Version 1.7.6 - Updated for vdr-1.7.12. - Updated Estonian translation (Thanks to Arthur Konovalov). - Added Lithuanian translation (Thanks to Valdemaras Pipiras). 2010-03-05: Version 1.7.7 - Updated for vdr-1.7.13. - Added a setup option to downscale the OSD size. - Updated Estonian translation (Thanks to Arthur Konovalov). 2010-06-23: Version 1.7.8 - Fixed device switching. - Added preliminary support for LATM. - Updated Italian translation (Thanks to Diego Pierotto). - Fixed a crash in femon service (Thanks to Wolfgang Astleitner). 2010-12-27: Version 1.7.9 - Updated for vdr-1.7.16. - Added Makefile depencency for objects. - Fixed detection of replaying. - Added support for LDFLAGS. 2011-05-15: Version 1.7.10 - Updated for vdr-1.7.18. - Added scaling for symbols. 2011-12-04: Version 1.7.11 - Updated for vdr-1.7.22: New API functions for signal strength and quality used to provide information for the OSD. - Added cppcheck target into Makefile. - Refactored bitstream code. 2012-01-15: Version 1.7.12 - Updated for vdr-1.7.23. - Updated SVDRP interface. - Added Hungarian translation (Thanks to Fuley Istvan). 2012-02-05: Version 1.7.13 - Added initial support for PVRINPUT devices (Thanks to Winfried Köhler). - Added initial support for IPTV devices. 2012-03-10: Version 1.7.14 - Updated for vdr-1.7.26. 2012-03-12: Version 1.7.15 - Cleaned up compilation warnings. - Fixed channel switching. 2012-03-25: Version 1.7.16 - Updated for vdr-1.7.27. - Cleaned up compilation warnings again. 2012-04-02: Version 1.7.17 - Added the dynamite compatibility patch (Thanks to Lars Hanisch). - Silenced error log messages when accessing pseudo devices. - Added a new theme: PearlHD (Thanks to Taipan @ VDRPortal). - Added the transponder info window support for IPTV devices. 2013-02-10: Version 1.7.18 - Updated for vdr-1.7.37. - Modified how the receiver is detached. - Added Ukrainian translation (Thanks to Yarema aka Knedlyk). 2013-03-10: Version 1.7.19 - Updated for vdr-1.7.40. - Updated French translation (Thanks to Bernard Jaulin). =================================== VDR Plugin 'femon' Revision History =================================== 2013-04-01: Version 2.0.0 - Updated for vdr-2.0.0. - Added Slovak translation (Thanks to Milan Hrala). 2014-01-10: Version 2.0.1 - Fixed a crash in SVDRP (Thanks for Lothar Englisch for reporting). - Fixed a memory leak and issues reported by scan-build tool. 2014-01-18: Version 2.0.2 - Added initial support for CAMs. 2014-03-08: Version 2.0.3 - Added support for SAT>IP devices. 2014-03-15: Version 2.0.4 - Refactored the SAT>IP support. =================================== VDR Plugin 'femon' Revision History =================================== 2014-03-16: Version 2.1.0 - Updated for vdr-2.1.6. 2014-05-10: Version 2.1.1 - Fixed the channel frequency value. 2015-01-10: Version 2.1.2 =================================== VDR Plugin 'femon' Revision History =================================== 2015-02-19: Version 2.2.0 - Updated for vdr-2.2.0. - Updated CA definitions. - Fixed the SVDRP service IP menu item (Thanks to Toerless Eckert). - Fixed the detaching of receiver during a channel switch. 2015-04-04: Version 2.2.1 - Got rid of FEMON_DEBUG. - Added support for tracing modes. - Removed the 'femonclient' plugin. femon-2.2.1/COPYING0000644000000000000000000004310612507636100012355 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. femon-2.2.1/osd.c0000644000000000000000000015416412507636100012262 0ustar rootroot/* * osd.c: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif #include #include #include "config.h" #include "iptvservice.h" #include "log.h" #include "receiver.h" #include "symbol.h" #include "tools.h" #include "osd.h" #define CHANNELINPUT_TIMEOUT 1000 #define SVDRPPLUGIN "svdrpservice" #define OSDWIDTH osdWidthM // in pixels #define OSDHEIGHT osdHeightM // in pixels #define OSDROWHEIGHT fontM->Height() // in pixels #define OSDINFOHEIGHT (OSDROWHEIGHT * 14) // in pixels (14 rows) #define OSDSTATUSHEIGHT (OSDROWHEIGHT * 6) // in pixels (6 rows) #define OSDSYMBOL(id) femonSymbols.Get(id) #define OSDSPACING femonSymbols.GetSpacing() #define OSDROUNDING femonSymbols.GetRounding() #define IS_OSDROUNDING (FemonConfig.GetSkin() == eFemonSkinElchi) #define IS_OSDRESOLUTION(r1, r2) (abs(r1 - r2) < 20) #define OSDINFOWIN_Y(offset) (FemonConfig.GetPosition() ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset) #define OSDINFOWIN_X(col) ((col == 4) ? int(round(OSDWIDTH * 0.76)) : \ (col == 3) ? int(round(OSDWIDTH * 0.51)) : \ (col == 2) ? int(round(OSDWIDTH * 0.26)) : \ int(round(OSDWIDTH * 0.025))) #define OSDSTATUSWIN_Y(offset) (FemonConfig.GetPosition() ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset)) #define OSDSTATUSWIN_X(col) ((col == 7) ? int(round(OSDWIDTH * 0.79)) : \ (col == 6) ? int(round(OSDWIDTH * 0.68)) : \ (col == 5) ? int(round(OSDWIDTH * 0.46)) : \ (col == 4) ? int(round(OSDWIDTH * 0.37)) : \ (col == 3) ? int(round(OSDWIDTH * 0.21)) : \ (col == 2) ? int(round(OSDWIDTH * 0.12)) : \ int(round(OSDWIDTH * 0.025))) #define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w)) #define OSDBARWIDTH(x) (OSDWIDTH * x / 100) #define OSDDRAWSTATUSBM(spacing) \ if (bm) { \ x -= bm->Width() + spacing; \ y = (OSDROWHEIGHT - bm->Height()) / 2; \ if (y < 0) y = 0; \ osdM->DrawBitmap(x, OSDSTATUSWIN_Y(offset) + y, *bm, FemonTheme[FemonConfig.GetTheme()].clrTitleText, FemonTheme[FemonConfig.GetTheme()].clrTitleBackground); \ } #define OSDDRAWSTATUSFRONTEND(column, bitmap, status) \ osdM->DrawBitmap(OSDSTATUSWIN_XSYMBOL(column, x), OSDSTATUSWIN_Y(offset) + y, bitmap, (frontendStatusM & status) ? FemonTheme[FemonConfig.GetTheme()].clrActiveText : FemonTheme[FemonConfig.GetTheme()].clrRed, FemonTheme[FemonConfig.GetTheme()].clrBackground) #define OSDDRAWSTATUSVALUES(label1, label2, label3, label4, label5, label6, label7) \ osdM->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), label1, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), label2, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), label3, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), label4, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), label5, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), label6, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), label7, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM) #define OSDDRAWSTATUSBAR(value) \ if (value > 0) { \ int barvalue = OSDBARWIDTH(value); \ osdM->DrawRectangle(0, OSDSTATUSWIN_Y(offset) + 3, min(OSDBARWIDTH(FemonConfig.GetRedLimit()), barvalue), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, FemonTheme[FemonConfig.GetTheme()].clrRed); \ if (barvalue > OSDBARWIDTH(FemonConfig.GetRedLimit())) \ osdM->DrawRectangle(OSDBARWIDTH(FemonConfig.GetRedLimit()), OSDSTATUSWIN_Y(offset) + 3, min((OSDWIDTH * FemonConfig.GetGreenLimit() / 100), barvalue), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, FemonTheme[FemonConfig.GetTheme()].clrYellow); \ if (barvalue > OSDBARWIDTH(FemonConfig.GetGreenLimit())) \ osdM->DrawRectangle(OSDBARWIDTH(FemonConfig.GetGreenLimit()), OSDSTATUSWIN_Y(offset) + 3, barvalue, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, FemonTheme[FemonConfig.GetTheme()].clrGreen); \ } #define OSDDRAWSTATUSTITLEBAR(title) \ osdM->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 1, FemonTheme[FemonConfig.GetTheme()].clrTitleBackground); \ osdM->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), title, FemonTheme[FemonConfig.GetTheme()].clrTitleText, FemonTheme[FemonConfig.GetTheme()].clrTitleBackground, fontM); \ if (IS_OSDROUNDING) { \ osdM->DrawEllipse(0, OSDSTATUSWIN_Y(0), OSDROUNDING, OSDSTATUSWIN_Y(OSDROUNDING), clrTransparent, -2); \ osdM->DrawEllipse(OSDWIDTH - OSDROUNDING, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDROUNDING), clrTransparent, -1); \ } \ osdM->DrawRectangle(0, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT, OSDWIDTH, OSDSTATUSWIN_Y(offset) + OSDSTATUSHEIGHT - 1, FemonTheme[FemonConfig.GetTheme()].clrBackground) #define OSDDRAWSTATUSBOTTOMBAR() \ if (IS_OSDROUNDING) { \ osdM->DrawEllipse(0, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT) - OSDROUNDING, OSDROUNDING, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -3); \ osdM->DrawEllipse(OSDWIDTH - OSDROUNDING, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT) - OSDROUNDING, OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -4); \ } #define OSDCLEARSTATUS() \ osdM->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT) - 1, clrTransparent) #define OSDDRAWINFOLEFT(label, value) \ osdM->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), label, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), value, FemonTheme[FemonConfig.GetTheme()].clrActiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM) #define OSDDRAWINFORIGHT(label, value) \ osdM->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), label, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), value, FemonTheme[FemonConfig.GetTheme()].clrActiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM) #define OSDDRAWINFOACTIVE(label, value) \ osdM->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), label, FemonTheme[FemonConfig.GetTheme()].clrActiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), value, FemonTheme[FemonConfig.GetTheme()].clrActiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM) #define OSDDRAWINFOINACTIVE(label, value) \ osdM->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), label, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ osdM->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), value, FemonTheme[FemonConfig.GetTheme()].clrActiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM) #define OSDDRAWINFOLINE(label) \ osdM->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), label, FemonTheme[FemonConfig.GetTheme()].clrActiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM) #define OSDDRAWINFOTITLEBAR(title) \ osdM->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset) + OSDROWHEIGHT - 1, FemonTheme[FemonConfig.GetTheme()].clrTitleBackground); \ osdM->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), title, FemonTheme[FemonConfig.GetTheme()].clrTitleText, FemonTheme[FemonConfig.GetTheme()].clrTitleBackground, fontM); \ if (IS_OSDROUNDING) { \ osdM->DrawEllipse(0, OSDINFOWIN_Y(0), OSDROUNDING, OSDINFOWIN_Y(OSDROUNDING), clrTransparent, -2); \ osdM->DrawEllipse(OSDWIDTH - OSDROUNDING, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDROUNDING), clrTransparent, -1); \ } \ osdM->DrawRectangle(0, OSDINFOWIN_Y(offset) + OSDROWHEIGHT, OSDWIDTH, OSDINFOWIN_Y(offset) + OSDINFOHEIGHT - 1, FemonTheme[FemonConfig.GetTheme()].clrBackground) #define OSDDRAWINFOBOTTOMBAR() \ if (IS_OSDROUNDING) { \ osdM->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT) - OSDROUNDING, OSDROUNDING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); \ osdM->DrawEllipse((OSDWIDTH - OSDROUNDING), OSDINFOWIN_Y(OSDINFOHEIGHT) - OSDROUNDING, OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); \ } #define OSDCLEARINFO() \ osdM->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT) - 1, clrTransparent) #ifndef MINFONTSIZE #define MINFONTSIZE 10 #endif #ifndef MAXFONTSIZE #define MAXFONTSIZE 64 #endif class cFemonDummyFont : public cFont { public: virtual int Width(uint cP) const { return 10; } virtual int Width(const char *sP) const { return 50; } virtual int Height(void) const { return 20; } virtual void DrawText(cBitmap *bitmapP, int xP, int yP, const char *sP, tColor colorFgP, tColor colorBgP, int widthP) const {} virtual void DrawText(cPixmap *pixmapP, int xP, int yP, const char *sP, tColor colorFgP, tColor colorBgP, int widthP) const {} }; cFemonOsd *cFemonOsd::pInstanceS = NULL; cFemonOsd *cFemonOsd::Instance(bool createP) { debug1("%s (%d)", __PRETTY_FUNCTION__, createP); if ((pInstanceS == NULL) && createP) { pInstanceS = new cFemonOsd(); } return (pInstanceS); } cFemonOsd::cFemonOsd() : cOsdObject(true), cThread("femon osd"), osdM(NULL), receiverM(NULL), frontendM(-1), svdrpFrontendM(-1), svdrpVideoBitRateM(-1), svdrpAudioBitRateM(-1), svdrpPluginM(NULL), numberM(0), oldNumberM(0), qualityM(0), qualityValidM(false), strengthM(0), strengthValidM(false), snrM(0), snrValidM(false), signalM(0), signalValidM(false), berM(0), berValidM(false), uncM(0), uncValidM(false), frontendNameM(""), frontendStatusValidM(false), deviceSourceM(DEVICESOURCE_DVBAPI), displayModeM(FemonConfig.GetDisplayMode()), osdWidthM(cOsd::OsdWidth() * (100 - FemonConfig.GetDownscale()) / 100), osdHeightM(cOsd::OsdHeight() * (100 - FemonConfig.GetDownscale()) / 100), osdLeftM(cOsd::OsdLeft() + (cOsd::OsdWidth() * FemonConfig.GetDownscale() / 200)), osdTopM(cOsd::OsdTop() + (cOsd::OsdHeight() * FemonConfig.GetDownscale() / 200)), inputTimeM(0), sleepM(), mutexM() { int tmp; debug1("%s", __PRETTY_FUNCTION__); memset(&frontendStatusM, 0, sizeof(frontendStatusM)); memset(&frontendInfoM, 0, sizeof(frontendInfoM)); svdrpConnectionM.handle = -1; femonSymbols.Refresh(); fontM = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE)); if (!fontM || !fontM->Height()) { fontM = new cFemonDummyFont; error("%s Cannot create required font", __PRETTY_FUNCTION__); } tmp = 5 * OSDSYMBOL(SYMBOL_LOCK).Width() + 6 * OSDSPACING; if (OSDWIDTH < tmp) { error("%s OSD width (%d) smaller than required (%d).", __PRETTY_FUNCTION__, OSDWIDTH, tmp); OSDWIDTH = tmp; } tmp = OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT; if (OSDHEIGHT < tmp) { error("%s OSD height (%d) smaller than required (%d).", __PRETTY_FUNCTION__, OSDHEIGHT, tmp); OSDHEIGHT = tmp; } } cFemonOsd::~cFemonOsd(void) { debug1("%s", __PRETTY_FUNCTION__); sleepM.Signal(); if (Running()) Cancel(3); if (svdrpConnectionM.handle >= 0) { svdrpPluginM = cPluginManager::GetPlugin(SVDRPPLUGIN); if (svdrpPluginM) svdrpPluginM->Service("SvdrpConnection-v1.0", &svdrpConnectionM); } if (receiverM) { receiverM->Deactivate(); DELETENULL(receiverM); } if (osdM) DELETENULL(osdM); if (fontM) DELETENULL(fontM); if (frontendM >= 0) { close(frontendM); frontendM = -1; } pInstanceS = NULL; } void cFemonOsd::DrawStatusWindow(void) { cMutexLock lock(&mutexM); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (osdM && channel) { cBitmap *bm = NULL; int offset = 0; int x = OSDWIDTH - OSDROUNDING; int y = 0; eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); OSDDRAWSTATUSTITLEBAR(*cString::sprintf("%d%s %s", numberM ? numberM : channel->Number(), numberM ? "-" : "", channel->ShortName(true))); if (svdrpFrontendM >= 0) { bm = &OSDSYMBOL(SYMBOL_SVDRP); OSDDRAWSTATUSBM(OSDSPACING); } switch (cDevice::ActualDevice()->CardIndex()) { case 1: bm = &OSDSYMBOL(SYMBOL_ONE); break; case 2: bm = &OSDSYMBOL(SYMBOL_TWO); break; case 3: bm = &OSDSYMBOL(SYMBOL_THREE); break; case 4: bm = &OSDSYMBOL(SYMBOL_FOUR); break; case 5: bm = &OSDSYMBOL(SYMBOL_FIVE); break; case 6: bm = &OSDSYMBOL(SYMBOL_SIX); break; case 7: bm = &OSDSYMBOL(SYMBOL_SEVEN); break; case 8: bm = &OSDSYMBOL(SYMBOL_EIGHT); break; default: bm = &OSDSYMBOL(SYMBOL_ZERO); break; } OSDDRAWSTATUSBM(OSDSPACING); bm = &OSDSYMBOL(SYMBOL_DEVICE); OSDDRAWSTATUSBM(0); if (IS_AUDIO_TRACK(track)) { switch (int(track - ttAudioFirst)) { case 1: bm = &OSDSYMBOL(SYMBOL_ONE); break; case 2: bm = &OSDSYMBOL(SYMBOL_TWO); break; case 3: bm = &OSDSYMBOL(SYMBOL_THREE); break; case 4: bm = &OSDSYMBOL(SYMBOL_FOUR); break; case 5: bm = &OSDSYMBOL(SYMBOL_FIVE); break; case 6: bm = &OSDSYMBOL(SYMBOL_SIX); break; case 7: bm = &OSDSYMBOL(SYMBOL_SEVEN); break; case 8: bm = &OSDSYMBOL(SYMBOL_EIGHT); break; default: bm = &OSDSYMBOL(SYMBOL_ZERO); break; } OSDDRAWSTATUSBM(OSDSPACING); switch (cDevice::PrimaryDevice()->GetAudioChannel()) { case 1: bm = &OSDSYMBOL(SYMBOL_MONO_LEFT); break; case 2: bm = &OSDSYMBOL(SYMBOL_MONO_RIGHT); break; default: bm = &OSDSYMBOL(SYMBOL_STEREO); break; } OSDDRAWSTATUSBM(0); } else if (receiverM && receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) { if (receiverM->AC3_5_1()) bm = &OSDSYMBOL(SYMBOL_DD51); else if (receiverM->AC3_2_0()) bm = &OSDSYMBOL(SYMBOL_DD20); else bm = &OSDSYMBOL(SYMBOL_DD); OSDDRAWSTATUSBM(OSDSPACING); } if (receiverM) { if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 1080)) { switch (receiverM->VideoScan()) { case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break; case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break; default: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080); break; } } else if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 720)) { switch (receiverM->VideoScan()) { case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_720i); break; case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_720p); break; default: bm = &OSDSYMBOL(SYMBOL_FORMAT_720); break; } } else if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 576)) { switch (receiverM->VideoScan()) { case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_576i); break; case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_576p); break; default: bm = &OSDSYMBOL(SYMBOL_FORMAT_576); break; } } else if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 480)) { switch (receiverM->VideoScan()) { case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_480i); break; case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_480p); break; default: bm = &OSDSYMBOL(SYMBOL_FORMAT_480); break; } } else bm = NULL; OSDDRAWSTATUSBM(OSDSPACING); switch (receiverM->VideoCodec()) { case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break; case VIDEO_CODEC_H264: bm = &OSDSYMBOL(SYMBOL_H264); break; default: bm = NULL; break; } OSDDRAWSTATUSBM(OSDSPACING); switch (receiverM->VideoFormat()) { case VIDEO_FORMAT_PAL: bm = &OSDSYMBOL(SYMBOL_PAL); break; case VIDEO_FORMAT_NTSC: bm = &OSDSYMBOL(SYMBOL_NTSC); break; default: bm = NULL; break; } OSDDRAWSTATUSBM(OSDSPACING); switch (receiverM->VideoAspectRatio()) { case VIDEO_ASPECT_RATIO_1_1: bm = &OSDSYMBOL(SYMBOL_AR_1_1); break; case VIDEO_ASPECT_RATIO_4_3: bm = &OSDSYMBOL(SYMBOL_AR_4_3); break; case VIDEO_ASPECT_RATIO_16_9: bm = &OSDSYMBOL(SYMBOL_AR_16_9); break; case VIDEO_ASPECT_RATIO_2_21_1: bm = &OSDSYMBOL(SYMBOL_AR_2_21_1); break; default: bm = NULL; break; } OSDDRAWSTATUSBM(OSDSPACING); } if (channel->Ca() > 0xFF) { bm = &OSDSYMBOL(SYMBOL_ENCRYPTED); OSDDRAWSTATUSBM(OSDSPACING); } offset += OSDROWHEIGHT; if (strengthValidM) OSDDRAWSTATUSBAR(strengthM); offset += OSDROWHEIGHT; if (qualityValidM) OSDDRAWSTATUSBAR(qualityM); offset += OSDROWHEIGHT; OSDDRAWSTATUSVALUES("STR:", signalValidM ? *cString::sprintf("%04x", signalM) : "", signalValidM ? *cString::sprintf("(%2d%%)", signalM / 655) : "", "BER:", berValidM ? *cString::sprintf("%08x", berM) : "", *cString::sprintf("%s:", tr("Video")), *getBitrateMbits(receiverM ? receiverM->VideoBitrate() : (svdrpFrontendM >= 0 ? svdrpVideoBitRateM : -1.0))); offset += OSDROWHEIGHT; OSDDRAWSTATUSVALUES("SNR:", snrValidM ? *cString::sprintf("%04x", snrM) : "", snrValidM ? *cString::sprintf("(%2d%%)", snrM / 655) : "", "UNC:", uncValidM ? *cString::sprintf("%08x", uncM) : "", *cString::sprintf("%s:", (receiverM && receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")), *getBitrateKbits(receiverM ? ((receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? receiverM->AC3Bitrate() : receiverM->AudioBitrate()) : (svdrpFrontendM >= 0 ? svdrpAudioBitRateM : -1.0))); offset += OSDROWHEIGHT; x = OSDSYMBOL(SYMBOL_LOCK).Width(); y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2; if (frontendStatusValidM) { OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK), FE_HAS_LOCK); OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL), FE_HAS_SIGNAL); OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), FE_HAS_CARRIER); OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), FE_HAS_VITERBI); OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC), FE_HAS_SYNC); } OSDDRAWSTATUSBOTTOMBAR(); osdM->Flush(); } } void cFemonOsd::DrawInfoWindow(void) { cMutexLock lock(&mutexM); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (osdM && channel) { int offset = 0; eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); switch (displayModeM) { case eFemonModeTransponder: OSDDRAWINFOTITLEBAR(tr("Transponder Information")); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Vpid"), *cString::sprintf("%d", channel->Vpid())); OSDDRAWINFORIGHT(trVDR("Ppid"), *cString::sprintf("%d", channel->Ppid())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( tr("Apid"), *getApids(channel)); OSDDRAWINFORIGHT( tr("Dpid"), *getDpids(channel)); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( tr("Spid"), *getSpids(channel)); OSDDRAWINFORIGHT(trVDR("Tpid"), *cString::sprintf("%d", channel->Tpid())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Sid"), *cString::sprintf("%d", channel->Sid())); OSDDRAWINFORIGHT( tr("Nid"), *cString::sprintf("%d", channel->Nid())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( tr("Tid"), *cString::sprintf("%d", channel->Tid())); OSDDRAWINFORIGHT( tr("Rid"), *cString::sprintf("%d", channel->Rid())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("CA"), *getCAids(channel)); offset += OSDROWHEIGHT; switch (channel->Source() & cSource::st_Mask) { case cSource::stSat: { cDvbTransponderParameters dtp(channel->Parameters()); OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getSatelliteSystem(dtp.System()), (svdrpFrontendM >= 0) ? svdrpFrontendM : cDevice::ActualDevice()->CardIndex(), *frontendNameM)); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Srate"), *cString::sprintf("%d", channel->Srate())); OSDDRAWINFORIGHT(trVDR("Polarization"), *cString::sprintf("%c", toupper(dtp.Polarization()))); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("System"), *getSatelliteSystem(dtp.System())); if (dtp.System()) { OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(dtp.RollOff())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Pilot"), *getPilot(dtp.Pilot())); } } break; case cSource::stCable: { cDvbTransponderParameters dtp(channel->Parameters()); OSDDRAWINFOLINE(*cString::sprintf("DVB-C #%d - %s", (svdrpFrontendM >= 0) ? svdrpFrontendM : cDevice::ActualDevice()->CardIndex(), *frontendNameM)); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Srate"), *cString::sprintf("%d", channel->Srate())); OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(dtp.Modulation())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH())); } break; case cSource::stTerr: { cDvbTransponderParameters dtp(channel->Parameters()); OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getTerrestrialSystem(dtp.System()), (svdrpFrontendM >= 0) ? svdrpFrontendM : cDevice::ActualDevice()->CardIndex(), *frontendNameM)); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(dtp.Transmission())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Bandwidth"), *getBandwidth(dtp.Bandwidth())); OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(dtp.Modulation())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFORIGHT(tr ("Coderate"), *cString::sprintf("%s (H) %s (L)", *getCoderate(dtp.CoderateH()), *getCoderate(dtp.CoderateL()))); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(dtp.Hierarchy())); OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(dtp.Guard())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("System"), *getTerrestrialSystem(dtp.System())); if (dtp.System()) { OSDDRAWINFORIGHT(trVDR("StreamId"), *cString::sprintf("%d", dtp.StreamId())); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT( trVDR("T2SystemId"),*cString::sprintf("%d", dtp.T2SystemId())); OSDDRAWINFORIGHT(trVDR("SISO/MISO"), *cString::sprintf("%d", dtp.SisoMiso())); } } break; case stIptv: { OSDDRAWINFOLINE(*cString::sprintf("IPTV #%d - %s", (svdrpFrontendM >= 0) ? svdrpFrontendM : cDevice::ActualDevice()->CardIndex(), *frontendNameM)); offset += OSDROWHEIGHT; if (svdrpFrontendM < 0) { cPlugin *p; IptvService_v1_0 data; data.cardIndex = cDevice::ActualDevice()->CardIndex(); p = cPluginManager::CallFirstService("IptvService-v1.0", &data); if (p) { OSDDRAWINFOLEFT(tr("Protocol"), *data.protocol); offset += OSDROWHEIGHT; OSDDRAWINFOLEFT(tr("Bitrate"), *data.bitrate); } } } break; default: break; } OSDDRAWINFOBOTTOMBAR(); break; case eFemonModeStream: OSDDRAWINFOTITLEBAR(tr("Stream Information")); offset += OSDROWHEIGHT; OSDDRAWINFOACTIVE( tr("Video Stream"), *getVideoStream(channel->Vpid())); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Codec"), *getVideoCodec(receiverM ? receiverM->VideoCodec() : VIDEO_CODEC_INVALID)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Bitrate"), *getVideoBitrate(receiverM ? receiverM->VideoBitrate() : 0, receiverM ? receiverM->VideoStreamBitrate() : 0)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Aspect Ratio"), *getAspectRatio(receiverM ? receiverM->VideoAspectRatio() : VIDEO_ASPECT_RATIO_INVALID)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Frame Rate"), *getFrameRate(receiverM ? receiverM->VideoFrameRate() : 0)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Video Format"), *getVideoFormat(receiverM ? receiverM->VideoFormat() : VIDEO_CODEC_INVALID)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Resolution"), *getResolution(receiverM ? receiverM->VideoHorizontalSize() : 0, receiverM ? receiverM->VideoVerticalSize() : 0, receiverM ? receiverM->VideoScan() : VIDEO_SCAN_INVALID)); offset += OSDROWHEIGHT; OSDDRAWINFOACTIVE( tr("Audio Stream"), *getAudioStream(track, channel)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Codec"), *getAudioCodec(receiverM ? receiverM->AudioCodec() : AUDIO_CODEC_INVALID)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Channel Mode"), *getAudioChannelMode(receiverM ? receiverM->AudioChannelMode() : AUDIO_CHANNEL_MODE_INVALID)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Bitrate"), *getAudioBitrate(receiverM ? receiverM->AudioBitrate() : 0, receiverM ? receiverM->AudioStreamBitrate() : 0)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Sampling Frequency"), *getAudioSamplingFreq(receiverM ? receiverM->AudioSamplingFreq() : AUDIO_SAMPLING_FREQUENCY_INVALID)); OSDDRAWINFOBOTTOMBAR(); break; case eFemonModeAC3: OSDDRAWINFOTITLEBAR(tr("Stream Information")); if (receiverM && receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) { offset += OSDROWHEIGHT; OSDDRAWINFOACTIVE( tr("AC-3 Stream"), *getAC3Stream(track, channel)); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Bitrate"), *getAudioBitrate(receiverM->AC3Bitrate(), receiverM->AC3StreamBitrate())); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Sampling Frequency"), *getAudioSamplingFreq(receiverM->AC3SamplingFreq())); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Bit Stream Mode"), *getAC3BitStreamMode(receiverM->AC3BitStreamMode(), receiverM->AC3AudioCodingMode())); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Audio Coding Mode"), *getAC3AudioCodingMode(receiverM->AC3AudioCodingMode(), receiverM->AC3BitStreamMode())); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Center Mix Level"), *getAC3CenterMixLevel(receiverM->AC3CenterMixLevel())); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Surround Mix Level"), *getAC3SurroundMixLevel(receiverM->AC3SurroundMixLevel())); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Dolby Surround Mode"), *getAC3DolbySurroundMode(receiverM->AC3DolbySurroundMode())); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Low Frequency Effects"), *cString::sprintf("%s", receiverM->AC3Lfe() ? trVDR("on") : trVDR("off"))); offset += OSDROWHEIGHT; OSDDRAWINFOINACTIVE(tr("Dialogue Normalization"), *getAC3DialogLevel(receiverM->AC3DialogLevel())); } OSDDRAWINFOBOTTOMBAR(); break; default: OSDCLEARINFO(); break; } osdM->Flush(); } } void cFemonOsd::Action(void) { debug1("%s", __PRETTY_FUNCTION__); cTimeMs t; SvdrpCommand_v1_0 cmd; cmd.command = cString::sprintf("PLUG %s INFO\r\n", PLUGIN_NAME_I18N); while (Running()) { t.Set(0); svdrpFrontendM = -1; svdrpVideoBitRateM = -1.0; svdrpAudioBitRateM = -1.0; switch (deviceSourceM) { case DEVICESOURCE_PVRINPUT: qualityM = cDevice::ActualDevice()->SignalStrength(); qualityValidM = (qualityM >= 0); strengthM = cDevice::ActualDevice()->SignalStrength(); strengthValidM = (strengthM >= 0); frontendNameM = cDevice::ActualDevice()->DeviceName(); frontendStatusM = (fe_status_t)(strengthValidM ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); frontendStatusValidM = strengthValidM; signalM = uint16_t(strengthM * 0xFFFF / 100); signalValidM = strengthValidM; snrM = 0; snrValidM = false; berM = 0; berValidM = false; uncM = 0; uncValidM = false; break; case DEVICESOURCE_IPTV: qualityM = cDevice::ActualDevice()->SignalQuality(); qualityValidM = (qualityM >= 0); strengthM = cDevice::ActualDevice()->SignalStrength(); strengthValidM = (strengthM >= 0); frontendNameM = cDevice::ActualDevice()->DeviceName(); frontendStatusM = (fe_status_t)(strengthValidM ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); frontendStatusValidM = strengthValidM; signalM = uint16_t(strengthM * 0xFFFF / 100); signalValidM = strengthValidM; snrM = uint16_t(qualityM * 0xFFFF / 100); snrValidM = qualityValidM; berM = 0; berValidM = false; uncM = 0; uncValidM = false; break; default: case DEVICESOURCE_DVBAPI: if (frontendM != -1) { qualityM = cDevice::ActualDevice()->SignalQuality(); qualityValidM = (qualityM >= 0); strengthM = cDevice::ActualDevice()->SignalStrength(); strengthValidM = (strengthM >= 0); frontendNameM = cDevice::ActualDevice()->DeviceName(); frontendStatusValidM = (ioctl(frontendM, FE_READ_STATUS, &frontendStatusM) >= 0); signalValidM = (ioctl(frontendM, FE_READ_SIGNAL_STRENGTH, &signalM) >= 0); snrValidM = (ioctl(frontendM, FE_READ_SNR, &snrM) >= 0); berValidM = (ioctl(frontendM, FE_READ_BER, &berM) >= 0); uncValidM = (ioctl(frontendM, FE_READ_UNCORRECTED_BLOCKS, &uncM) >= 0); } else if (strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) { qualityM = cDevice::ActualDevice()->SignalQuality(); qualityValidM = (qualityM >= 0); strengthM = cDevice::ActualDevice()->SignalStrength(); strengthValidM = (strengthM >= 0); frontendNameM = cDevice::ActualDevice()->DeviceName(); frontendStatusM = (fe_status_t)(cDevice::ActualDevice()->HasLock() ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); frontendStatusValidM = strengthValidM; signalM = uint16_t(strengthM * 0xFFFF / 100); signalValidM = strengthValidM; snrM = uint16_t(qualityM * 0xFFFF / 100); snrValidM = qualityValidM; berM = 0; berValidM = false; uncM = 0; uncValidM = false; } else if (svdrpConnectionM.handle >= 0) { cmd.handle = svdrpConnectionM.handle; svdrpPluginM->Service("SvdrpCommand-v1.0", &cmd); if (cmd.responseCode == 900) { strengthValidM = false; qualityValidM = false; frontendStatusValidM = false; signalValidM = false; snrValidM = false; berValidM = false; uncValidM = false; for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) { const char *s = line->Text(); if (!strncasecmp(s, "CARD:", 5)) svdrpFrontendM = (int)strtol(s + 5, NULL, 10); else if (!strncasecmp(s, "STRG:", 5)) { strengthM = (int)strtol(s + 5, NULL, 10); strengthValidM = (strengthM >= 0); } else if (!strncasecmp(s, "QUAL:", 5)) { qualityM = (int)strtol(s + 5, NULL, 10); qualityValidM = (qualityM >= 0); } else if (!strncasecmp(s, "TYPE:", 5)) frontendInfoM.type = (fe_type_t)strtol(s + 5, NULL, 10); else if (!strncasecmp(s, "NAME:", 5)) { frontendNameM = s + 5; } else if (!strncasecmp(s, "STAT:", 5)) { frontendStatusM = (fe_status_t)strtol(s + 5, NULL, 16); frontendStatusValidM = true; } else if (!strncasecmp(s, "SGNL:", 5)) { signalM = (uint16_t)strtol(s + 5, NULL, 16); signalValidM = true; } else if (!strncasecmp(s, "SNRA:", 5)) { snrM = (uint16_t)strtol(s + 5, NULL, 16); snrValidM = true; } else if (!strncasecmp(s, "BERA:", 5)) { berM = (uint32_t)strtol(s + 5, NULL, 16); berValidM = true; } else if (!strncasecmp(s, "UNCB:", 5)) { uncM = (uint32_t)strtol(s + 5, NULL, 16); uncValidM = true; } else if (!strncasecmp(s, "VIBR:", 5)) svdrpVideoBitRateM = (double)strtol(s + 5, NULL, 10); else if (!strncasecmp(s, "AUBR:", 5)) svdrpAudioBitRateM = (double)strtol(s + 5, NULL, 10); } } } break; } DrawInfoWindow(); DrawStatusWindow(); sleepM.Wait(max((int)(100 * FemonConfig.GetUpdateInterval() - t.Elapsed()), 3)); } } void cFemonOsd::Show(void) { debug1("%s", __PRETTY_FUNCTION__); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); deviceSourceM = DEVICESOURCE_DVBAPI; if (channel) { if (channel->IsSourceType('I')) deviceSourceM = DEVICESOURCE_IPTV; else if (channel->IsSourceType('V')) deviceSourceM = DEVICESOURCE_PVRINPUT; } if (deviceSourceM == DEVICESOURCE_DVBAPI) { if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) { cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); frontendM = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1; if (frontendM >= 0) { if (ioctl(frontendM, FE_GET_INFO, &frontendInfoM) < 0) { if (!FemonConfig.GetUseSvdrp()) error("%s Cannot read frontend info", __PRETTY_FUNCTION__); close(frontendM); frontendM = -1; memset(&frontendInfoM, 0, sizeof(frontendInfoM)); return; } } else if (FemonConfig.GetUseSvdrp()) { if (!SvdrpConnect() || !SvdrpTune()) return; } else { error("%s Cannot open frontend device", __PRETTY_FUNCTION__); return; } } } else frontendM = -1; osdM = cOsdProvider::NewOsd(osdLeftM, osdTopM); if (osdM) { tArea Areas1[] = { { 0, 0, OSDWIDTH - 1, OSDHEIGHT - 1, 8 } }; if (Setup.AntiAlias && osdM->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) { osdM->SetAreas(Areas1, sizeof(Areas1) / sizeof(tArea)); } else { tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0), OSDWIDTH - 1, OSDSTATUSWIN_Y(0) + OSDSTATUSHEIGHT - 1, FemonTheme[FemonConfig.GetTheme()].bpp }, { 0, OSDINFOWIN_Y(0), OSDWIDTH - 1, OSDINFOWIN_Y(0) + OSDROWHEIGHT - 1, FemonTheme[FemonConfig.GetTheme()].bpp }, { 0, OSDINFOWIN_Y(OSDROWHEIGHT), OSDWIDTH - 1, OSDINFOWIN_Y(0) + OSDINFOHEIGHT - 1, 2 } }; osdM->SetAreas(Areas2, sizeof(Areas2) / sizeof(tArea)); } OSDCLEARSTATUS(); OSDCLEARINFO(); osdM->Flush(); if (receiverM) { receiverM->Deactivate(); DELETENULL(receiverM); } if (FemonConfig.GetAnalyzeStream() && channel) { receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); cDevice::ActualDevice()->AttachReceiver(receiverM); } Start(); } } void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool liveViewP) { debug1("%s (%d, %d, %d)", __PRETTY_FUNCTION__, deviceP->DeviceNumber(), channelNumberP, liveViewP); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (!deviceP || !liveViewP) return; if (!channelNumberP) { if (receiverM) { receiverM->Deactivate(); DELETENULL(receiverM); } return; } if (channel && FemonConfig.GetAnalyzeStream()) { deviceSourceM = DEVICESOURCE_DVBAPI; if (channel->IsSourceType('I')) deviceSourceM = DEVICESOURCE_IPTV; else if (channel->IsSourceType('V')) deviceSourceM = DEVICESOURCE_PVRINPUT; if (frontendM >= 0) { close(frontendM); frontendM = -1; } if (deviceSourceM == DEVICESOURCE_DVBAPI) { if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) { cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); frontendM = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1; if (frontendM >= 0) { if (ioctl(frontendM, FE_GET_INFO, &frontendInfoM) < 0) { if (!FemonConfig.GetUseSvdrp()) error("%s Cannot read frontend info", __PRETTY_FUNCTION__); close(frontendM); frontendM = -1; memset(&frontendInfoM, 0, sizeof(frontendInfoM)); return; } } else if (FemonConfig.GetUseSvdrp()) { if (!SvdrpConnect() || !SvdrpTune()) return; } else { error("%s Cannot open frontend device", __PRETTY_FUNCTION__); return; } } if (receiverM) { receiverM->Deactivate(); DELETENULL(receiverM); } receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); cDevice::ActualDevice()->AttachReceiver(receiverM); } } } void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP) { debug1("%s (%d, )", __PRETTY_FUNCTION__, indexP); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); if (receiverM) { receiverM->Deactivate(); DELETENULL(receiverM); } if (FemonConfig.GetAnalyzeStream()) { const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (channel) { receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); cDevice::ActualDevice()->AttachReceiver(receiverM); } } } bool cFemonOsd::DeviceSwitch(int directionP) { debug1("%s (%d)", __PRETTY_FUNCTION__, directionP); int device = cDevice::ActualDevice()->DeviceNumber(); int direction = sgn(directionP); if (device >= 0) { cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (channel) { for (int i = 0; i < cDevice::NumDevices() - 1; i++) { if (direction >= 0) { if (++device >= cDevice::NumDevices()) device = 0; } else { if (--device < 0) device = cDevice::NumDevices() - 1; } // Collect the current priorities of all CAM slots that can decrypt the channel: int NumCamSlots = CamSlots.Count(); int SlotPriority[NumCamSlots]; int NumUsableSlots = 0; bool NeedsDetachAllReceivers = false; bool InternalCamNeeded = false; bool ValidDevice = false; cCamSlot *s = NULL; cDevice *d = cDevice::GetDevice(device); if (channel->Ca() >= CA_ENCRYPTED_MIN) { for (cCamSlot *CamSlot = CamSlots.First(); CamSlot; CamSlot = CamSlots.Next(CamSlot)) { SlotPriority[CamSlot->Index()] = MAXPRIORITY + 1; // assumes it can't be used if (CamSlot->ModuleStatus() == msReady) { if (CamSlot->ProvidesCa(channel->Caids())) { if (!ChannelCamRelations.CamChecked(channel->GetChannelID(), CamSlot->SlotNumber())) { SlotPriority[CamSlot->Index()] = CamSlot->Priority(); NumUsableSlots++; } } } } if (!NumUsableSlots) InternalCamNeeded = true; // no CAM is able to decrypt this channel } for (int j = 0; j < NumCamSlots || !NumUsableSlots; ++j) { if (NumUsableSlots && SlotPriority[j] > MAXPRIORITY) continue; // there is no CAM available in this slot bool HasInternalCam = d->HasInternalCam(); if (InternalCamNeeded && !HasInternalCam) continue; // no CAM is able to decrypt this channel and the device uses vdr handled CAMs if (NumUsableSlots && !HasInternalCam && !CamSlots.Get(j)->Assign(d, true)) continue; // CAM slot can't be used with this device if (d->ProvidesChannel(channel, 0, &NeedsDetachAllReceivers)) { // this device is basically able to do the job debug1("%s (%d) device=%d", __PRETTY_FUNCTION__, direction, device); if (NumUsableSlots && !HasInternalCam && d->CamSlot() && d->CamSlot() != CamSlots.Get(j)) NeedsDetachAllReceivers = true; // using a different CAM slot requires detaching receivers if (NumUsableSlots && !HasInternalCam) s = CamSlots.Get(j); ValidDevice = true; break; } if (!NumUsableSlots) break; // no CAM necessary, so just one loop over the devices } // Do the actual switch if valid device found if (d && ValidDevice) { cControl::Shutdown(); if (NeedsDetachAllReceivers) d->DetachAllReceivers(); if (s) { if (s->Device() != d) { if (s->Device()) s->Device()->DetachAllReceivers(); if (d->CamSlot()) d->CamSlot()->Assign(NULL); s->Assign(d); } } else if (d->CamSlot() && !d->CamSlot()->IsDecrypting()) d->CamSlot()->Assign(NULL); d->SwitchChannel(channel, false); cControl::Launch(new cTransferControl(d, channel)); return (true); } } } } return (false); } bool cFemonOsd::SvdrpConnect(void) { if (svdrpConnectionM.handle < 0) { svdrpPluginM = cPluginManager::GetPlugin(SVDRPPLUGIN); if (svdrpPluginM) { svdrpConnectionM.serverIp = FemonConfig.GetSvdrpIp(); svdrpConnectionM.serverPort = (unsigned short)FemonConfig.GetSvdrpPort(); svdrpConnectionM.shared = true; svdrpPluginM->Service("SvdrpConnection-v1.0", &svdrpConnectionM); if (svdrpConnectionM.handle >= 0) { SvdrpCommand_v1_0 cmd; cmd.handle = svdrpConnectionM.handle; cmd.command = cString::sprintf("PLUG %s\r\n", PLUGIN_NAME_I18N); svdrpPluginM->Service("SvdrpCommand-v1.0", &cmd); if (cmd.responseCode != 214) { svdrpPluginM->Service("SvdrpConnection-v1.0", &svdrpConnectionM); // close connection error("%s Cannot find plugin '%s' on server %s", __PRETTY_FUNCTION__, PLUGIN_NAME_I18N, *svdrpConnectionM.serverIp); } } else error("%s Cannot connect to SVDRP server", __PRETTY_FUNCTION__); } else error("%s Cannot find plugin '%s'", __PRETTY_FUNCTION__, SVDRPPLUGIN); } return svdrpConnectionM.handle >= 0; } bool cFemonOsd::SvdrpTune(void) { if (svdrpPluginM && svdrpConnectionM.handle >= 0) { cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (channel) { SvdrpCommand_v1_0 cmd; cmd.handle = svdrpConnectionM.handle; cmd.command = cString::sprintf("CHAN %s\r\n", *channel->GetChannelID().ToString()); svdrpPluginM->Service("SvdrpCommand-v1.0", &cmd); if (cmd.responseCode == 250) return true; error("%s Cannot tune server channel", __PRETTY_FUNCTION__); } else error("%s Invalid channel", __PRETTY_FUNCTION__); } else error("%s Unexpected connection state", __PRETTY_FUNCTION__); return false; } double cFemonOsd::GetVideoBitrate(void) { debug1("%s", __PRETTY_FUNCTION__); double value = 0.0; if (receiverM) value = receiverM->VideoBitrate(); return (value); } double cFemonOsd::GetAudioBitrate(void) { debug1("%s", __PRETTY_FUNCTION__); double value = 0.0; if (receiverM) value = receiverM->AudioBitrate(); return (value); } double cFemonOsd::GetDolbyBitrate(void) { debug1("%s", __PRETTY_FUNCTION__); double value = 0.0; if (receiverM) value = receiverM->AC3Bitrate(); return (value); } eOSState cFemonOsd::ProcessKey(eKeys keyP) { eOSState state = cOsdObject::ProcessKey(keyP); if (state == osUnknown) { switch (int(keyP)) { case k0: if ((numberM == 0) && (oldNumberM != 0)) { numberM = oldNumberM; oldNumberM = cDevice::CurrentChannel(); Channels.SwitchTo(numberM); numberM = 0; return osContinue; } case k1 ... k9: if (numberM >= 0) { numberM = numberM * 10 + keyP - k0; if (numberM > 0) { DrawStatusWindow(); cChannel *ch = Channels.GetByNumber(numberM); inputTimeM.Set(0); // Lets see if there can be any useful further input: int n = ch ? numberM * 10 : 0; while (ch && (ch = Channels.Next(ch)) != NULL) { if (!ch->GroupSep()) { if (n <= ch->Number() && ch->Number() <= n + 9) { n = 0; break; } if (ch->Number() > n) n *= 10; } } if (n > 0) { // This channel is the only one that fits the input, so let's take it right away: oldNumberM = cDevice::CurrentChannel(); Channels.SwitchTo(numberM); numberM = 0; } } } break; case kBack: return osEnd; case kGreen: { eTrackType types[ttMaxTrackTypes]; eTrackType CurrentAudioTrack = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); int numTracks = 0; int oldTrack = 0; int track = 0; for (int i = ttAudioFirst; i <= ttDolbyLast; i++) { const tTrackId *TrackId = cDevice::PrimaryDevice()->GetTrack(eTrackType(i)); if (TrackId && TrackId->id) { types[numTracks] = eTrackType(i); if (i == CurrentAudioTrack) track = numTracks; numTracks++; } } oldTrack = track; if (++track >= numTracks) track = 0; if (track != oldTrack) { cDevice::PrimaryDevice()->SetCurrentAudioTrack(types[track]); Setup.CurrentDolby = IS_DOLBY_TRACK(types[track]); } } break; case kYellow: if (IS_AUDIO_TRACK(cDevice::PrimaryDevice()->GetCurrentAudioTrack())) { int audioChannel = cDevice::PrimaryDevice()->GetAudioChannel(); int oldAudioChannel = audioChannel; if (++audioChannel > 2) audioChannel = 0; if (audioChannel != oldAudioChannel) { cDevice::PrimaryDevice()->SetAudioChannel(audioChannel); } } break; case kRight: DeviceSwitch(1); break; case kLeft: DeviceSwitch(-1); break; case kUp|k_Repeat: case kUp: case kDown|k_Repeat: case kDown: oldNumberM = cDevice::CurrentChannel(); cDevice::SwitchChannel(NORMALKEY(keyP) == kUp ? 1 : -1); numberM = 0; break; case kNone: if (numberM && (inputTimeM.Elapsed() > CHANNELINPUT_TIMEOUT)) { if (Channels.GetByNumber(numberM)) { oldNumberM = cDevice::CurrentChannel(); Channels.SwitchTo(numberM); numberM = 0; } else { inputTimeM.Set(0); numberM = 0; } } break; case kOk: { // toggle between display modes cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (++displayModeM == eFemonModeAC3 && channel && !channel->Dpid(0)) displayModeM++; if (displayModeM >= eFemonModeMaxNumber) displayModeM = 0; DrawInfoWindow(); } break; default: break; } state = osContinue; } return state; } femon-2.2.1/mpeg.h0000644000000000000000000000125512507636100012422 0ustar rootroot/* * mpeg.h: Frontend Status Monitor plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #ifndef __FEMON_MPEG_H #define __FEMON_MPEG_H #include "video.h" #include "audio.h" class cFemonMPEG { private: cFemonVideoIf *videoHandlerM; cFemonAudioIf *audioHandlerM; static int bitrateS[2][3][16]; static int sampleRateS[2][4]; static eAudioCodec formatS[2][4]; public: cFemonMPEG(cFemonVideoIf *videoHandlerP, cFemonAudioIf *audioHandlerP); virtual ~cFemonMPEG(); bool processVideo(const uint8_t *bufP, int lenP); bool processAudio(const uint8_t *bufP, int lenP); }; #endif //__FEMON_MPEG_H