2012-04-20 60 views
1

下面的代码旨在实现两种策略来插入缺少的数据包 - 两种策略是1)用无声填充空白,或2)重复以前的数据包,如果超过一个小包用沉默填满了其余的部分。该代码有广泛的评论,但我似乎无法弄清楚不同的变量应该是什么意思。有人会介意帮助我理解这些代码吗?感谢任何指导!C/C++ - 了解音频插值代码

#include "interpolate.h" 
#include "assert.h" 

/* write a packet's worth of silence */ 
void write_silence(FILE *ofile, int num_samples) { 
    short missing_pkt[num_samples]; 
    int i; 
    for (i=0; i < num_samples; i++) { 
    missing_pkt[i]=0; 
    } 
    fwrite(missing_pkt, 1, num_samples*2, ofile); 
} 

/* simulate the reception of a packet, and apply a loss repair strategy */ 
void recv_packet(int seqno, int len, char *data, FILE *ofile, int strategy) { 
    static int prev_seqno = -1; 
    static short* prev_samples = 0; 

    /* interpret the data as signed 16 bit integers */ 
    short *samples = (short*)data; 
    int num_samples = len/2; 

    printf("recv_packet: seqno=%d\n", seqno); 

    if (prev_seqno != -1 && (prev_seqno+1 != seqno)) { 
    int i, missing_seqno; 
    /* there was missing data */ 

    printf("s=%d\n", strategy); 
    switch(strategy) { 
    case SILENCE: 
     { 
    /* create a packet containing silence */ 
    missing_seqno = prev_seqno + 1; 
    while (missing_seqno < seqno) { 
     write_silence(ofile, num_samples); 
     missing_seqno++; 
    } 
    break; 
     } 
    case REPEAT_PREV: 
     { 
    /* repeat the previous packet */ 
    fwrite(prev_samples, 2, num_samples, ofile); 
    missing_seqno = prev_seqno + 2; 
    while (missing_seqno < seqno) { 
     /* repeating the same packet more than once sounds bad */ 
     write_silence(ofile, num_samples); 
     missing_seqno++; 
    } 
    break; 
     } 

    default: 
     abort(); 
    } 
    } 

    fwrite(samples, 1, num_samples*2, ofile); 

    /* hold onto the last received packet - we may need it */ 
    if (prev_samples != 0) 
    free(prev_samples); 
    prev_samples = samples; 
    prev_seqno = seqno; 
}; 
+0

一旦你想出来了,确保你在好的数据包和插入的数据包之间添加某种淡入淡出;否则,不连续性将导致可怕的点击。 – 2012-04-20 09:47:29

+0

需要一些时间来理解您将需要的C语法和基本功能。似乎你还不熟悉。 (ps不是C++) – UmNyobe 2012-04-20 10:03:44

回答

1

变量约定:

  • seqno:序列号
  • samples:音频数据作为样本
  • prev_:以前
  • ofile:输出文件

你怎么知道代码应该做什么而不理解它? 这个想法是数据包有递增的序号,从0到无穷大。 -1是初始状态,甚至没有收到数据包。 当你当你进入这个条件接收数据包和

if (prev_seqno != -1 //it is not the first packet 
     && 
    (prev_seqno+1 != seqno) //the packet is not the one we expected 
    ){ 
    //there are (seqno - prev_seqno - 1) packet missing. 
    //do something about it. 

那么你有一定的差距。根据策略,您可以将输出文件ofile填入静默或收到的最后一个样本的副本。在音频silence = 0

例如,如果最后一个数据包为0并且您收到数据包4,则表示数据包1,2和3丢失。在这种情况下,根据策略,您会将1,2,3作为静音数据包或重复使用0。

+0

感谢您的帮助UmNyobe(就像这个名字!)这是考试准备练习的一部分 - 练习包括实施一些更多的策略,但在我能做到这些之前,我需要理解代码。这个问题说明了这些策略应该做什么。 我可以问,为什么序列号从-1开始?此外,我似乎无法理解为什么条件: prev_seqno!= -1 &&(prev_seqno + 1!= seqno) 构成了一个缺口。你介意阐述吗?谢谢 – user1058210 2012-04-20 09:54:05

+0

-1只是一个选择,它可能是任何东西。让我编辑我的答案。 – UmNyobe 2012-04-20 09:56:20

+0

感谢您的解释 - 我现在理解第二个条款,但是这不是说只有前一个序列号不是第一个数据包才能存在差距吗?当然这是不正确的,因为你可以接收第一个数据包,错过第二个数据包,并接收第三个数据包,即序列号为-1,1。 – user1058210 2012-04-20 10:06:53