1

以下のコードは、欠落しているパケットを補間する2つの戦略を実装することを目的としています。2つの戦略は、1)ギャップを無音で埋める、または2)前のパケットを繰り返し、1つより長い場合は残りを無音で埋めます。コードには幅広いコメントがありますが、さまざまな変数が何を意味するのかについて頭を悩ませているようには見えません。誰かが私にこのコードを理解する手助けをしてくれませんか?ガイダンスに感謝します!

#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;
};
4

1 に答える 1

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が繰り返されていると見なします。

于 2012-04-20T09:31:00.063 に答える