Author: rizzo
Date: Thu Jul 26 07:32:31 2007
New Revision: 77265

URL: http://svn.digium.com/view/asterisk?view=rev&rev=77265
Log:
more updates to this code - echo back the received
video stream to test the other direction as well.


Modified:
    team/rizzo/astobj2/channels/chan_oss.c

Modified: team/rizzo/astobj2/channels/chan_oss.c
URL: 
http://svn.digium.com/view/asterisk/team/rizzo/astobj2/channels/chan_oss.c?view=diff&rev=77265&r1=77264&r2=77265
==============================================================================
--- team/rizzo/astobj2/channels/chan_oss.c (original)
+++ team/rizzo/astobj2/channels/chan_oss.c Thu Jul 26 07:32:31 2007
@@ -346,6 +346,10 @@
        SDL_Overlay             *bmp;
        int                     lastrxframe;
        int                     discard;
+       struct timeval  ts;
+       int received;
+
+       struct ast_frame *echo;
 };
 
 struct _cm {   /* map ffmpeg codec types to asterisk formats */
@@ -419,6 +423,7 @@
        env->bmp                = NULL;
        env->lastrxframe        = -1;
 
+       env->ts = ast_tvnow();
        codec = map_video_format(format);
        ast_log(LOG_WARNING, "init for format 0x%x gives %d\n", format, codec);
        avcodec_init();
@@ -473,6 +478,15 @@
  */
 static void ffmpeg_uninit(struct video_desc *env)
 {
+       struct ast_frame *f;
+       int i = 0;
+
+       while ( (f = env->echo) != NULL) {
+               env->echo = AST_LIST_NEXT(f, frame_list);
+               ast_frfree(f);
+               i++;
+       }
+       ast_log(LOG_WARNING, "ffmpeg_uninit drop %d frames\n", i);
        if(env->context) {
                avcodec_close(env->context);
                av_free(env->context);
@@ -645,12 +659,26 @@
        uint8_t *data;
        int len;
        struct video_desc *env = get_video_desc(chan);
+       struct timeval now = ast_tvnow();
+       int i;
+       struct ast_frame *f1, **fp;
 
        if(!env->initialized)
                ffmpeg_init(env, f->subclass);
        if(!env->initialized)
                return -1;      /* error */
-
+       f1 = ast_frdup(f);
+       for (fp = &env->echo; (*fp) != NULL ; fp = &AST_LIST_NEXT((*fp), 
frame_list) )
+               ;
+       *fp = f1;
+
+       i = ast_tvdiff_ms(now, env->ts);
+       if (i > 1000) {
+               ast_log(LOG_WARNING, "received %d video frames in %d ms\n", 
env->received, i);
+               env->received = 0;
+               env->ts = now;
+       }
+       env->received++;
 #if defined(DROP_PACKETS) && DROP_PACKETS > 0
        /*
        * Fragment of code to simulate lost/delayed packets
@@ -1369,9 +1397,35 @@
        struct chan_oss_pvt *o = c->tech_pvt;
        struct ast_frame *f = &o->read_f;
 
+       static int cnt;
+       static struct timeval ta;
+       struct timeval tb;
+
+       struct video_desc *env = get_video_desc(c);
+       if (env->echo) {
+               struct ast_frame *f1;
+               int i = 0;
+               for (f1 = env->echo; f1; f1 = AST_LIST_NEXT(f1, frame_list) )
+                       i++;
+               ast_log(LOG_WARNING, "oss_read echo %d video frames\n", i);
+       }
+
+       tb = ast_tvnow();
+       if (tb.tv_sec > ta.tv_sec + 5) {
+               ast_log(LOG_WARNING, "read %d audio frames in %d ms\n",
+                       cnt, ast_tvdiff_ms(tb, ta));
+               ta = tb;
+               cnt = 0;
+       }
+       cnt++;
+
        /* XXX can be simplified returning &ast_null_frame */
        /* prepare a NULL frame in case we don't have enough data to return */
        bzero(f, sizeof(struct ast_frame));
+
+       AST_LIST_NEXT(f, frame_list) = env->echo;
+       env->echo = NULL;
+
        f->frametype = AST_FRAME_NULL;
        f->src = oss_tech.type;
 


_______________________________________________
--Bandwidth and Colocation Provided by http://www.api-digital.com--

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to