<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/gapk/+/19494">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gapk: Implemnet optional looping/rewinding of input files<br><br>Together with the recently-added throttling, this can be useful to<br>generate a continuous stream of RTP data from an input file.<br><br>Change-Id: I2d552695dfb4cc96039838e79e0f5ae25a6737c8<br>---<br>M include/osmocom/gapk/procqueue.h<br>M src/app_osmo_gapk.c<br>M src/pq_file.c<br>3 files changed, 22 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/gapk refs/changes/94/19494/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gapk/procqueue.h b/include/osmocom/gapk/procqueue.h</span><br><span>index 82c1cf9..be10f7a 100644</span><br><span>--- a/include/osmocom/gapk/procqueue.h</span><br><span>+++ b/include/osmocom/gapk/procqueue.h</span><br><span>@@ -20,6 +20,7 @@</span><br><span> #pragma once</span><br><span> </span><br><span> #include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span> #include <stdio.h> /* for FILE */</span><br><span> </span><br><span> #include <osmocom/core/linuxlist.h></span><br><span>@@ -85,7 +86,7 @@</span><br><span> struct osmo_gapk_pq_item *osmo_gapk_pq_add_item(struct osmo_gapk_pq *pq);</span><br><span> </span><br><span> /* File */</span><br><span style="color: hsl(0, 100%, 40%);">-int osmo_gapk_pq_queue_file_input(struct osmo_gapk_pq *pq, FILE *src, unsigned int block_len);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_gapk_pq_queue_file_input(struct osmo_gapk_pq *pq, FILE *src, unsigned int block_len, bool loop);</span><br><span> int osmo_gapk_pq_queue_file_output(struct osmo_gapk_pq *pq, FILE *dst, unsigned int block_len);</span><br><span> </span><br><span> /* RTP */</span><br><span>diff --git a/src/app_osmo_gapk.c b/src/app_osmo_gapk.c</span><br><span>index 1e4e9a0..5e85548 100644</span><br><span>--- a/src/app_osmo_gapk.c</span><br><span>+++ b/src/app_osmo_gapk.c</span><br><span>@@ -68,6 +68,7 @@</span><br><span>  /* RTP payload type */</span><br><span>       uint8_t rtp_pt_in, rtp_pt_out;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    bool loop_input;</span><br><span>     int throttle;</span><br><span>        int benchmark;</span><br><span>       int verbose;</span><br><span>@@ -144,6 +145,7 @@</span><br><span>   fprintf(stdout, "  -P  --rtp-pt-out=TYPE\t\tRTP payload type for outgoing frames\n");</span><br><span>      fprintf(stdout, "  -b, --enable-benchmark\tEnable codec benchmarking\n");</span><br><span>  fprintf(stdout, "  -t, --throttle\tEnable throttling (one codec frame every 20ms)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(stdout, "  -l, --loop-input\tEnable looping of the input file\n");</span><br><span>         fprintf(stdout, "  -v, --verbose\t\t\tEnable debug messages\n");</span><br><span>   fprintf(stdout, "\n");</span><br><span> </span><br><span>@@ -217,10 +219,11 @@</span><br><span>                 {"rtp-pt-out", 1, 0, 'P'},</span><br><span>                 {"enable-benchmark", 0, 0, 'b'},</span><br><span>           {"throttle", 0, 0, 't'},</span><br><span style="color: hsl(120, 100%, 40%);">+            {"loop-input", 0, 0, 'l'},</span><br><span>                 {"verbose", 0, 0, 'v'},</span><br><span>            {"help", 0, 0, 'h'},</span><br><span>       };</span><br><span style="color: hsl(0, 100%, 40%);">-      const char *short_options = "i:o:I:O:f:g:p:P:btvh"</span><br><span style="color: hsl(120, 100%, 40%);">+  const char *short_options = "i:o:I:O:f:g:p:P:btlvh"</span><br><span> #ifdef HAVE_ALSA</span><br><span>            "a:A:"</span><br><span> #endif</span><br><span>@@ -322,6 +325,10 @@</span><br><span>                    opt->throttle = 1;</span><br><span>                        break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            case 'l':</span><br><span style="color: hsl(120, 100%, 40%);">+                     opt->loop_input = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>             case 'v':</span><br><span>                    log_parse_category_mask(osmo_stderr_target, "DAPP");</span><br><span>                       opt->verbose = 1;</span><br><span>@@ -577,7 +584,7 @@</span><br><span> </span><br><span>       /* File read */</span><br><span>      if (gs->in.file.fh)</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_gapk_pq_queue_file_input(gs->pq, gs->in.file.fh, fmt_in->frame_len);</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_gapk_pq_queue_file_input(gs->pq, gs->in.file.fh, fmt_in->frame_len, gs->opts.loop_input);</span><br><span>   else if (gs->in.rtp.fd != -1)</span><br><span>             osmo_gapk_pq_queue_rtp_input(gs->pq, gs->in.rtp.fd,</span><br><span>                    fmt_in->frame_len, gs->opts.rtp_pt_in);</span><br><span>diff --git a/src/pq_file.c b/src/pq_file.c</span><br><span>index d496eec..d214096 100644</span><br><span>--- a/src/pq_file.c</span><br><span>+++ b/src/pq_file.c</span><br><span>@@ -19,6 +19,7 @@</span><br><span> </span><br><span> #include <errno.h></span><br><span> #include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span> #include <talloc.h></span><br><span> </span><br><span> #include <osmocom/gapk/logging.h></span><br><span>@@ -30,6 +31,7 @@</span><br><span> struct pq_state_file {</span><br><span>        FILE *fh;</span><br><span>    unsigned int blk_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool loop_input;</span><br><span> };</span><br><span> </span><br><span> </span><br><span>@@ -39,6 +41,10 @@</span><br><span>  struct pq_state_file *state = _state;</span><br><span>        int rv;</span><br><span>      rv = fread(out, state->blk_len, 1, state->fh);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rv == 0 && state->loop_input && feof(state->fh)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          rewind(state->fh);</span><br><span style="color: hsl(120, 100%, 40%);">+         rv = fread(out, state->blk_len, 1, state->fh);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span>    if (rv <= 0)</span><br><span>              return -1;</span><br><span>   return rv * state->blk_len;</span><br><span>@@ -60,7 +66,7 @@</span><br><span> }</span><br><span> </span><br><span> static int</span><br><span style="color: hsl(0, 100%, 40%);">-pq_queue_file_op(struct osmo_gapk_pq *pq, FILE *fh, unsigned int blk_len, int in_out_n)</span><br><span style="color: hsl(120, 100%, 40%);">+pq_queue_file_op(struct osmo_gapk_pq *pq, FILE *fh, unsigned int blk_len, int in_out_n, bool loop_input)</span><br><span> {</span><br><span>      struct osmo_gapk_pq_item *item;</span><br><span>      struct pq_state_file *state;</span><br><span>@@ -71,6 +77,7 @@</span><br><span> </span><br><span>         state->fh = fh;</span><br><span>   state->blk_len = blk_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  state->loop_input = loop_input;</span><br><span> </span><br><span>       item = osmo_gapk_pq_add_item(pq);</span><br><span>    if (!item) {</span><br><span>@@ -105,11 +112,11 @@</span><br><span>  *  \param[in] blk_len block length to be read from file</span><br><span>  *  \returns 0 on success; negative on error */</span><br><span> int</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_gapk_pq_queue_file_input(struct osmo_gapk_pq *pq, FILE *src, unsigned int blk_len)</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_gapk_pq_queue_file_input(struct osmo_gapk_pq *pq, FILE *src, unsigned int blk_len, bool loop)</span><br><span> {</span><br><span>   LOGPGAPK(LOGL_DEBUG, "PQ '%s': Adding file input (blk_len=%u)\n",</span><br><span>          pq->name, blk_len);</span><br><span style="color: hsl(0, 100%, 40%);">-  return pq_queue_file_op(pq, src, blk_len, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ return pq_queue_file_op(pq, src, blk_len, 1, loop);</span><br><span> }</span><br><span> </span><br><span> /*! Add file output to given processing queue</span><br><span>@@ -123,5 +130,5 @@</span><br><span> {</span><br><span>     LOGPGAPK(LOGL_DEBUG, "PQ '%s': Adding file output (blk_len=%u)\n",</span><br><span>                 pq->name, blk_len);</span><br><span style="color: hsl(0, 100%, 40%);">-  return pq_queue_file_op(pq, dst, blk_len, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ return pq_queue_file_op(pq, dst, blk_len, 0, false);</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/gapk/+/19494">change 19494</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/gapk/+/19494"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: gapk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2d552695dfb4cc96039838e79e0f5ae25a6737c8 </div>
<div style="display:none"> Gerrit-Change-Number: 19494 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>