Author: rizzo
Date: Thu Jul 26 03:19:29 2007
New Revision: 77264

URL: http://svn.digium.com/view/asterisk?view=rev&rev=77264
Log:
+ fix console hangup
+ introduce a translation map for asterisk-ffmpeg codec formats


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=77264&r1=77263&r2=77264
==============================================================================
--- team/rizzo/astobj2/channels/chan_oss.c (original)
+++ team/rizzo/astobj2/channels/chan_oss.c Thu Jul 26 03:19:29 2007
@@ -348,6 +348,16 @@
        int                     discard;
 };
 
+struct _cm {   /* map ffmpeg codec types to asterisk formats */
+       uint32_t        ast_format;     /* 0 is a terminator */
+       enum CodecID    codec;
+};
+
+static struct _cm video_formats[] = {
+       { AST_FORMAT_H263_PLUS, CODEC_ID_H263 },
+       { 0,                    0 },
+};
+
 /* Helper function to process incoming video.
  * For each incoming video call invoke ffmpeg_init() to intialize
  * the decoding structure then incoming video frames are processed
@@ -358,10 +368,6 @@
  * to display the frame.
  *
  */
-/* Initialize the decoding structure */
-static void ffmpeg_init(struct video_desc *);
-/* Uninitialize the decoding structure */
-static void ffmpeg_uninit(struct video_desc *);
 /* Extract the bitstream from the RTP payload */
 static uint8_t *pre_process_data(uint8_t *, int *);
 /* Decode video frame once completed */
@@ -373,8 +379,18 @@
 
 /* Macros used as a wrapper around the actual video format we want to use */
 #define AST_FORMAT_CUSTOM (AST_FORMAT_H263_PLUS)
-#define CODEC_ID_CUSTOM CODEC_ID_H263
 static int write_video(struct ast_channel *chan, struct ast_frame *f);
+
+/*! \brief map an asterisk format into an ffmpeg one */
+static enum CodecID map_video_format(uint32_t ast_format)
+{
+       struct _cm *i;
+
+       for (i = video_formats; i->ast_format != 0; i++)
+               if (ast_format & i->ast_format)
+                       return i->codec;
+       return CODEC_ID_NONE;
+}
 
 /*
  * It initializes the video_desc struct which contains all the structures
@@ -387,8 +403,10 @@
  * - Allocation of a new frame
  * - Initializzation of the SDL environment to support the video
  */
-static void ffmpeg_init(struct video_desc *env)
-{
+static void ffmpeg_init(struct video_desc *env, uint32_t format)
+{
+       enum CodecID codec;
+
        env->codec              = NULL;
        env->context            = NULL;
        env->frame              = NULL;
@@ -401,6 +419,8 @@
        env->bmp                = NULL;
        env->lastrxframe        = -1;
 
+       codec = map_video_format(format);
+       ast_log(LOG_WARNING, "init for format 0x%x gives %d\n", format, codec);
        avcodec_init();
        /*
         * Register all codecs supported by the ffmpeg library.
@@ -411,9 +431,9 @@
         * Searching for the H.263+ decoder; in the decoding process
         * the H.263 decoder in compatible with H.263+ stream.
         */
-       env->codec = avcodec_find_decoder(CODEC_ID_H263);
+       env->codec = avcodec_find_decoder(codec);
        if(!env->codec) {
-               ast_log(LOG_WARNING, "Unable to find the H.263 decoder\n");;
+               ast_log(LOG_WARNING, "Unable to find the decoder for format 
%d\n", codec);
                return;
        }
 
@@ -426,7 +446,7 @@
                return;
        }
 
-       env->parser = av_parser_init(CODEC_ID_H263);
+       env->parser = av_parser_init(codec);
        if(!env->parser) {
                ast_log(LOG_WARNING, "Unable to initialize the H.263 codec 
parser\n");
                return;
@@ -453,10 +473,6 @@
  */
 static void ffmpeg_uninit(struct video_desc *env)
 {
-       if (!env) {
-               ast_log(LOG_WARNING, "ffmpeg_uninit on null\n");
-               return;
-       }
        if(env->context) {
                avcodec_close(env->context);
                av_free(env->context);
@@ -596,7 +612,6 @@
                env->bmp = SDL_CreateYUVOverlay(env->context->width, 
env->context->height,
                        SDL_YV12_OVERLAY, env->screen);
 
-ast_log(LOG_WARNING, "locked sdl\n");
        SDL_LockYUVOverlay(env->bmp);
        pict.data[0] = env->bmp->pixels[0];
        pict.data[1] = env->bmp->pixels[2];
@@ -609,7 +624,6 @@
                (AVPicture *)env->frame, env->context->pix_fmt,
                env->context->width, env->context->height);
        SDL_UnlockYUVOverlay(env->bmp);
-ast_log(LOG_WARNING, "unlocked sdl\n");
 
        rect.x = 0; rect.y = 0;
        rect.w = env->context->width;
@@ -632,6 +646,8 @@
        int len;
        struct video_desc *env = get_video_desc(chan);
 
+       if(!env->initialized)
+               ffmpeg_init(env, f->subclass);
        if(!env->initialized)
                return -1;      /* error */
 
@@ -1491,13 +1507,6 @@
                }
        }
 
-#if HAVE_FFMPEG
-       /* Let's initialize the environment only if a new call arrives */
-       /* Initializations for ffmpeg decoding */
-       /* XXX This should be allocated for each video session */
-       ffmpeg_init(&o->env);
-#endif
-
        return c;
 }
 
@@ -1673,9 +1682,6 @@
        if (o->owner)
                ast_queue_hangup(o->owner);
        setformat(o, O_CLOSE);
-#if HAVE_FFMPEG
-       ffmpeg_uninit(&o->env);
-#endif
        return CLI_SUCCESS;
 }
 


_______________________________________________
--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