C/C++ - Понимание кода интерполяции звука
Приведенный ниже код предназначен для реализации двух стратегий интерполяции по отсутствующим пакетам - две стратегии: 1) заполнить пробел молчанием или 2) повторить предыдущий пакет, а если он длиннее, то заполнить оставшуюся часть молчанием. Код имеет широкие комментарии, но я не могу понять, что означают различные переменные. Будет ли кто-нибудь возражать, чтобы помочь мне разобраться в этом коде? Цени любое руководство!
#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;
};
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.