rawv.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * raw video codec
  23.  */
  24. #include "rawv.h"
  25. #include <mp4v2/mp4.h>
  26. static codec_data_t *rawv_create (format_list_t *media_fmt,
  27.   video_info_t *vinfo,
  28.   const uint8_t *userdata,
  29.   uint32_t ud_size,
  30.   video_vft_t *vft,
  31.   void *ifptr)
  32. {
  33.   rawv_codec_t *rawv;
  34.   if (vinfo == NULL) return NULL;
  35.   rawv = (rawv_codec_t *)malloc(sizeof(rawv_codec_t));
  36.   rawv->m_vft = vft;
  37.   rawv->m_ifptr = ifptr;
  38.   rawv->m_h = vinfo->height;
  39.   rawv->m_w = vinfo->width;
  40.   rawv->m_vft->video_configure(rawv->m_ifptr, 
  41.        vinfo->width,
  42.        vinfo->height,
  43.        VIDEO_FORMAT_YUV);
  44.   return ((codec_data_t *)rawv);
  45. }
  46. static void rawv_close (codec_data_t *ifptr)
  47. {
  48.   rawv_codec_t *rawv;
  49.   rawv = (rawv_codec_t *)ifptr;
  50.   free(rawv);
  51. }
  52. static void rawv_do_pause (codec_data_t *ifptr)
  53. {
  54. }
  55. static int rawv_video_frame_is_sync (codec_data_t *ptr,
  56.      uint8_t *buffer, 
  57.      uint32_t buflen,
  58.      void *ud)
  59. {
  60.   return 1;
  61. }
  62. static int rawv_decode (codec_data_t *ptr,
  63. uint64_t ts, 
  64. int from_rtp,
  65. int *sync_frame,
  66. uint8_t *buffer, 
  67. uint32_t buflen,
  68. void *ud)
  69. {
  70.   int ret;
  71.   rawv_codec_t *rawv = (rawv_codec_t *)ptr;
  72.   uint32_t len;
  73.   len = rawv->m_h * rawv->m_w;  
  74.   uint8_t *y, *u, *v;
  75.   y = buffer;
  76.   u = buffer + len;
  77.   v = u + (len / 4);
  78.   if (len + (len / 2) != buflen) {
  79.      rawv->m_vft->log_msg(LOG_ERR, "rawv", 
  80.   "error - raw video buflen not right len %d h %d w %d",
  81.   len, rawv->m_h, rawv->m_w);
  82.      return -1;
  83.   }
  84.                        
  85.   ret = rawv->m_vft->video_have_frame(rawv->m_ifptr,
  86.       y, u, v, rawv->m_w, rawv->m_w / 2, ts);
  87.   return (buflen);
  88. }
  89. static const char *rawv_compressors[] = {
  90.   "i420", 
  91.   NULL,
  92. };
  93. static int rawv_codec_check (lib_message_func_t message,
  94.      const char *compressor,
  95.      int type,
  96.      int profile,
  97.      format_list_t *fptr,
  98.      const uint8_t *userdata,
  99.      uint32_t userdata_size)
  100. {
  101.   if (compressor != NULL && 
  102.       (strcasecmp(compressor, "MP4 FILE") == 0)) {
  103.     if (type == MP4_YUV12_VIDEO_TYPE) {
  104.       return 1;
  105.     }
  106.     return -1;
  107.   }
  108.   if (compressor != NULL) {
  109.     const char **lptr = rawv_compressors;
  110.     while (*lptr != NULL) {
  111.       if (strcasecmp(*lptr, compressor) == 0) {
  112. return 1;
  113.       }
  114.       lptr++;
  115.     }
  116.   }
  117.   return -1;
  118. }
  119. VIDEO_CODEC_PLUGIN("rawv", 
  120.    rawv_create,
  121.    rawv_do_pause,
  122.    rawv_decode,
  123.    NULL, 
  124.    rawv_close,
  125.    rawv_codec_check,
  126.    rawv_video_frame_is_sync);