SDT压缩数据线性插值解压实现

public struct point
    {
        public point(double pointx, double pointy)
        {
            this.x = pointx;
            this.y = pointy;
        }
        private double x;
        private double y;
        public double X
        {
            get
            {
                return x;
            }

            set
            {
                x = value;
            }
        }
        public double Y
        {
            get
            {
                return y;
            }

            set
            {
                y = value;
            }
        }
    }
/// <summary>
        /// 线性插值解压 
        /// </summary>
        /// <param name="originData">原始数据</param>
        /// <param name="SDTData">压缩数据</param>
        /// <param name="progress">进度</param>
        /// <param name="cancel">取消</param>
        /// <returns></returns>
        public List<point> SDTUncompress(List<point> originData,List<point> SDTData,IProgress<int> progress, CancellationToken cancel)
        {
            List<point> UncompreeDate=new List<point>();
            point newPoint=new point();
            int num = 0;
            if (SDTData.Count <= 1)
                return null;
            for (int i = 0; i <SDTData.Count-1; i++)
            {
                double k = (SDTData[i + 1].Y - (SDTData[i].Y))/(SDTData[i + 1].X - (SDTData[i].X));
                int startIndex = FindIndex(originData, SDTData[i].X);
                int endIndex = FindIndex(originData, SDTData[i + 1].X);
                for (int j = startIndex; j < endIndex; j++)
                {
                    newPoint.X = originData[j].X;
                    newPoint.Y=k*(originData[j].X - SDTData[i].X)
                    +SDTData[i].Y;
                    UncompreeDate.Add(newPoint);
                    num++;
                    cancel.ThrowIfCancellationRequested();
                    progress?.Report((num * 100 / originData.Count));
                }
            }
            if(UncompreeDate.Count<originData.Count)
            {
                int startIndex1 = FindIndex(originData, SDTData.LastOrDefault().X);
                for (int j = startIndex1; j < originData.Count; j++)
                {
                    newPoint.X = originData[j].X;
                    double k = (SDTData[SDTData.Count - 1].Y - (SDTData[SDTData.Count - 2].Y)) / (SDTData[SDTData.Count - 1].X - (SDTData[SDTData.Count - 2].X));
                    newPoint.Y = k * (originData[j].X - SDTData[SDTData.Count - 1].X)
                        + SDTData[SDTData.Count - 1].Y;
                    UncompreeDate.Add(newPoint);
                    num++;
                    cancel.ThrowIfCancellationRequested();
                    progress?.Report(num * 100 / originData.Count );
                }
            }
           
            return UncompreeDate;
        }
        private int FindIndex(List<point> list,double value)
        {
            int index = list.FindIndex(s => s.X==value);
            return index;
        }


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用C语言编写代码来生成DVB SDT(Service Description Table)表。要实现这个功能,你可以使用libpsisi库来构建和生成SDT表的数据。 首先,你需要安装libpsisi库并包含它的头文件。然后,你可以使用以下步骤来生成SDT表: 1. 创建一个PSI(Program Specific Information)的结构体,并初始化它。这个结构体包含了SDT表的各个字段,如table_id、section_length、transport_stream_id等。 ```c psi_sdt_t sdt; memset(&sdt, 0, sizeof(psi_sdt_t)); // 设置SDT表的字段 sdt.table_id = PSI_SDT_TABLE_ID; // SDT表的table_id sdt.section_length = 0; // 后续数据的长度,在生成SDT表后会被更新 sdt.transport_stream_id = transport_stream_id; // 传输流ID // ... ``` 2. 创建一个PSI的数据流,并将SDT表的结构体添加到数据流中。 ```c psi_data_t psi_data; psi_data_init(&psi_data); // 添加SDT表的结构体到数据流中 psi_data_add_sdt(&psi_data, &sdt); ``` 3. 生成SDT表的二进制数据。 ```c uint8_t *sdt_data; size_t sdt_data_length; // 生成SDT表的二进制数据 psi_data_generate(&psi_data, &sdt_data, &sdt_data_length); ``` 4. 更新SDT表的section_length字段。 ```c // 更新SDT表的section_length字段 sdt.section_length = sdt_data_length - PSI_SECTION_HEADER_LENGTH; ``` 现在,你就可以使用生成的SDT表的二进制数据进行后续的处理,比如写入到文件或发送到DVB设备中。 请注意,上述代码只是一个简单的示例,你可能需要根据你的具体需求进行适当的修改。此外,生成SDT表还需要填充其他字段,如service_id、service_name等,以确保生成的SDT表符合你的要求。你可以参考libpsisi库的文档和示例代码来了解更多细节和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值