codec_plugin.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:15k
源码类别:

流媒体/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. 2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * codec_plugin.h - audio/video plugin definitions for player
  23.  */
  24. #ifndef __CODEC_PLUGIN_H__
  25. #define __CODEC_PLUGIN_H__ 1
  26. #include "systems.h"
  27. #include <sdp/sdp.h>
  28. /***************************************************************************
  29.  *  Audio callbacks from plugin to renderer
  30.  ***************************************************************************/
  31. /*
  32.  * audio_configure_f - audio configuration - called when initializing
  33.  * audio output.
  34.  * Inputs:
  35.  *   ifptr - handle passed when created
  36.  *   freq - frequency in samples per second
  37.  *   chans - number of channels
  38.  *   format - audio format definitions from lib/SDL/include/SDL_audio.h
  39.  *   max_samples - number of samples required after processing each frame
  40.  *     Use a 0 for unknown or variable size.
  41.  *     variable size must use audio_load_buffer interface
  42.  * Outputs:
  43.  *   nothing
  44.  */
  45. typedef void (*audio_configure_f)(void *ifptr,
  46.   int freq,
  47.   int chans,
  48.   int format,
  49.   uint32_t max_samples);
  50. /*
  51.  * audio_get_buffer_f - get an audio ring buffer to fill
  52.  *  called before decoding a frame
  53.  * Inputs: ifptr - pointer to handle
  54.  * Outputs: unsigned char pointer to buffer to write to.
  55.  */
  56. typedef uint8_t *(*audio_get_buffer_f)(void *ifptr);
  57. /*
  58.  * audio_filled_buffer_f - routine to call after decoding
  59.  *  audio frame into a buffer gotten above.
  60.  * Inputs:
  61.  *    ifptr - pointer to handle
  62.  *    ts - timestamp of audio packet
  63.  *    resync_required - 1 if the ts given is not the next consecutive
  64.  *          timestamp.  Note - this may not be needed.
  65.  */
  66. typedef void (*audio_filled_buffer_f)(void *ifptr,
  67.       uint64_t ts,
  68.       int resync_required);
  69. /*
  70.  * audio_load_buffer_f - load local audio buffer with a variable number of
  71.  * bytes
  72.  * Inputs:
  73.  *    ifptr - pointer to handle
  74.  *    from - pointer to from buffer
  75.  *    bytes - number of bytes (not samples) in buffer
  76.  *    ts - timestamp of start of buffer
  77.  *    resync - resync required
  78.  */
  79. typedef uint32_t (*audio_load_buffer_f)(void *ifptr,
  80. uint8_t *from,
  81. uint32_t bytes,
  82. uint64_t ts,
  83. int resync);
  84. /*
  85.  * audio_vft_t - virtual function table for audio events
  86.  */
  87. typedef struct audio_vft_t {
  88.   lib_message_func_t log_msg;
  89.   audio_configure_f audio_configure;
  90.   audio_get_buffer_f audio_get_buffer;
  91.   audio_filled_buffer_f audio_filled_buffer;
  92.   audio_load_buffer_f audio_load_buffer;
  93. } audio_vft_t;
  94. /*****************************************************************************
  95.  * Video callbacks from plugin to renderer
  96.  *****************************************************************************/
  97. #define VIDEO_FORMAT_YUV 1
  98. /*
  99.  * video_configure_f - configure video sizes
  100.  * Inputs: ifptr - pointer to handle passed
  101.  *         w - width in pixels
  102.  *         h - height in pixels
  103.  *         format - right now, only VIDEO_FORMAT_YUV
  104.  * Outputs: none
  105.  */
  106. typedef void (*video_configure_f)(void *ifptr,
  107.   int w,
  108.   int h,
  109.   int format);
  110. /*
  111.  * video_get_buffer_f - request y, u and v buffers before decoding
  112.  * Inputs: ifptr - handle
  113.  * Outputs: y - pointer to y buffer
  114.  *          u - pointer to u buffer
  115.  *          v - pointer to v buffer
  116.  * return value: 0 - no buffer
  117.  *               1 - valid buffer
  118.  * Note: will wait for return until buffer ready
  119.  */
  120. typedef int (*video_get_buffer_f)(void *ifptr,
  121.   uint8_t **y,
  122.   uint8_t **u,
  123.   uint8_t **v);
  124. /*
  125.  * video_filled_buffer_f - indicates we've filled buffer gotten above
  126.  * Inputs - ifptr - handle
  127.  *          display_time - timestamp to display
  128.  */
  129. typedef int (*video_filled_buffer_f)(void *ifptr,
  130.      uint64_t display_time);
  131. /*
  132.  * video_have_frame_f - instead of using video_get_buffer and
  133.  *   video_filled_buffer, can use this instead if buffer is stored locally
  134.  * Inputs: ifptr - handle
  135.  *         y - pointer to y data
  136.  *         u - pointer to u data
  137.  *         v - pointer to v data
  138.  *         m_pixelw_y - width of each row in y above (might not be width)
  139.  *         m_pixelw_uv - width of each row in u and v
  140.  *         time - render time
  141.  */
  142. typedef int (*video_have_frame_f)(void *ifptr,
  143.   const uint8_t *y,
  144.   const uint8_t *u,
  145.   const uint8_t *v,
  146.   int m_pixelw_y,
  147.   int m_pixelw_uv,
  148.   uint64_t time);
  149. /*
  150.  * video_vft_t - video virtual function table
  151.  */
  152. typedef struct video_vft_t {
  153.   lib_message_func_t log_msg;
  154.   video_configure_f video_configure;
  155.   video_get_buffer_f video_get_buffer;
  156.   video_filled_buffer_f video_filled_buffer;
  157.   video_have_frame_f video_have_frame;
  158. } video_vft_t;
  159. /**************************************************************************
  160.  *  Routines plugin must provide
  161.  **************************************************************************/
  162. typedef struct video_info_t {
  163.   int height;
  164.   int width;
  165. } video_info_t;
  166. typedef struct audio_info_t {
  167.   int freq;
  168.   int chans;
  169.   int bitspersample;
  170. } audio_info_t;
  171. /*
  172.  * The codec data returned must start with this structure
  173.  */
  174. typedef struct codec_data_t {
  175.   void *ifptr;
  176.   union {
  177.     video_vft_t *video_vft;
  178.     audio_vft_t *audio_vft;
  179.   } v;
  180. } codec_data_t;
  181. /*
  182.  * ac_create_f - audio codec plugin creation routine
  183.  * Inputs: sdp_media - pointer to session description information for stream
  184.  *         audio - pointer to audio information
  185.  *         user_data - pointer to user data
  186.  *         userdata_size - size of user data
  187.  *         if_vft - pointer to audio vft to use
  188.  *         ifptr - handle to use for audio callbacks
  189.  * Returns - must return a handle that contains codec_data_t.
  190.  */
  191. typedef codec_data_t *(*ac_create_f)(format_list_t *sdp_media,
  192.      audio_info_t *audio,
  193.      const uint8_t *user_data,
  194.      uint32_t userdata_size,
  195.      audio_vft_t *if_vft,
  196.      void *ifptr);
  197. /*
  198.  * vc_create_f - video codec plugin creation routine
  199.  * Inputs: sdp_media - pointer to session description information for stream
  200.  *         video - pointer to video information
  201.  *         user_data - pointer to user data
  202.  *         userdata_size - size of user data
  203.  *         if_vft - pointer to video vft to use
  204.  *         ifptr - handle to use for video callbacks
  205.  * Returns - must return a handle that contains codec_data_t.
  206.  */
  207. typedef codec_data_t *(*vc_create_f)(format_list_t *sdp_media,
  208.      video_info_t *video,
  209.      const uint8_t *user_data,
  210.      uint32_t userdata_size,
  211.      video_vft_t *if_vft,
  212.      void *ifptr);
  213. /*
  214.  * c_close_f - close plugin - free all data, including ptr
  215.  */
  216. typedef void (*c_close_f)(codec_data_t *ptr);
  217. /*
  218.  * c_do_pause_f - called when a pause has taken place.  Next data may not
  219.  * match previous - skip may occur
  220.  */
  221. typedef void (*c_do_pause_f)(codec_data_t *ptr);
  222. /*
  223.  * c_decode_frame_f - ah, the money callback.  decode the frame
  224.  * Inputs: ptr - pointer to codec handle
  225.  *         ts - timestamp as derived by bytestream
  226.  *         from_rtp - if it's from RTP - may not be needed
  227.  *         buffer - pointer to frame to decode (can be guaranteed that there
  228.  *           is a complete frame - maybe more than 1
  229.  *         buflen - length of buffer
  230.  * Outputs:
  231.  *         sync_frame - 1 if a special frame (for example, an I frame for
  232.  *               video)
  233.  * Returns:
  234.  *        -1 - couldn't decode in whole frame
  235.  *       <1-buflen> - number of bytes decoded
  236.  */
  237. typedef int (*c_decode_frame_f)(codec_data_t *ptr,
  238. uint64_t ts,
  239. int from_rtp,
  240. int *sync_frame,
  241. uint8_t *buffer,
  242. uint32_t buflen, 
  243. void *userdata);
  244. typedef int (*c_video_frame_is_sync_f)(codec_data_t *ptr,
  245.        uint8_t *buffer,
  246.        uint32_t buflen,
  247.        void *userdata);
  248. typedef int (*c_print_status_f)(codec_data_t *ptr, 
  249. char *buffer, 
  250. uint32_t buflen);
  251. /*
  252.  * c_compress_check_f - see if a plugin can decode the bit stream
  253.  *  note - create function from above must be called afterwards
  254.  * Inputs - msg - can use for debug messages
  255.  *   compressor - pointer to codec.  For .mp4 files, this will be "MP4 FILE".
  256.  *   type - video type.  valid for .mp4 files
  257.  *   profile - video profile level - valid for .mp4 files
  258.  *   fptr - pointer to sdp data
  259.  *   userdata - pointer to user data to check out - might have VOL header,
  260.  *     for example
  261.  *   userdata_size - size of userdata in bytes
  262.  * Return Value - -1 for not handled.
  263.  *                number - weighted value of how well decoding can do.
  264.  */
  265. typedef int (*c_compress_check_f)(lib_message_func_t msg,
  266.   const char *compressor,
  267.   int type,
  268.   int profile,
  269.   format_list_t *fptr,
  270.   const uint8_t *userdata,
  271.   uint32_t userdata_size);
  272. /*
  273.  * c_raw_file_check_f - see if this codec can handle raw files
  274.  * Note - this could be designed a bit better - like a 2 stage check
  275.  *   and create.
  276.  * Inputs: msg - for debug messags
  277.  *         filename - name of file (duh)
  278.  * Outputs - max_time 0.0 if not seekable, otherwise time
  279.  *           desc[4] - 4 slots for descriptions
  280.  */
  281. typedef codec_data_t *(*c_raw_file_check_f)(lib_message_func_t msg,
  282.     const char *filename,
  283.     double *max_time,
  284.     char *desc[4]);
  285. /*
  286.  * c_raw_file_next_frame_f - get a data buffer with a full frame of data
  287.  * Inputs: your_data - handle
  288.  * Outputs: buffer - pointer to buffer
  289.  *          ts - pointer to timestamp
  290.  * Return value - number of bytes (0 for no frame)
  291.  */
  292. typedef int (*c_raw_file_next_frame_f)(codec_data_t *your_data,
  293.       uint8_t **buffer,
  294.       uint64_t *ts);
  295. /*
  296.  * c_raw_file_used_for_frame_f - indicates number of bytes decoded
  297.  * by decoder
  298.  */
  299. typedef void (*c_raw_file_used_for_frame_f)(codec_data_t *your_data,
  300.     uint32_t bytes);
  301. /*
  302.  * c_raw_file_seek_to_f - seek to ts.
  303.  */
  304. typedef int (*c_raw_file_seek_to_f)(codec_data_t *your_data,
  305.     uint64_t ts);
  306. /*
  307.  * c_raw_file_skip_frame_f - indicates that we should skip the next frame
  308.  * used for video raw frames only
  309.  */
  310. typedef int (*c_raw_file_skip_frame_f)(codec_data_t *ptr);
  311. /*
  312.  * c_raw_file_has_eof_f - return indication of end of file reached
  313.  */
  314. typedef int (*c_raw_file_has_eof_f)(codec_data_t *ptr);
  315. typedef struct codec_plugin_t {
  316.   const char *c_name;
  317.   const char *c_type;
  318.   const char *c_version;
  319.   ac_create_f  ac_create;
  320.   vc_create_f  vc_create;
  321.   // add vc_create_f here and below
  322.   c_do_pause_f            c_do_pause;
  323.   c_decode_frame_f        c_decode_frame;
  324.   c_close_f               c_close;
  325.   c_compress_check_f      c_compress_check;
  326.   c_raw_file_check_f      c_raw_file_check;
  327.   c_raw_file_next_frame_f c_raw_file_next_frame;
  328.   c_raw_file_used_for_frame_f c_raw_file_used_for_frame;
  329.   c_raw_file_seek_to_f    c_raw_file_seek_to;
  330.   c_raw_file_skip_frame_f c_skip_frame;
  331.   c_raw_file_has_eof_f    c_raw_file_has_eof;
  332.   c_video_frame_is_sync_f c_video_frame_is_sync;
  333.   c_print_status_f        c_print_status;
  334. } codec_plugin_t;
  335. #ifdef _WIN32
  336. #define DLL_EXPORT __declspec(dllexport)
  337. #else
  338. #define DLL_EXPORT
  339. #endif
  340. #define PLUGIN_VERSION "0.4"
  341. /*
  342.  * Use this for an audio plugin without raw file support
  343.  */
  344. #define AUDIO_CODEC_PLUGIN(name, 
  345.                            create, 
  346.    do_pause, 
  347.                            decode, 
  348.                            print_status, 
  349.    close,
  350.    compress_check) 
  351. extern "C" { codec_plugin_t DLL_EXPORT mpeg4ip_codec_plugin = { 
  352.    name, 
  353.    "audio", 
  354.    PLUGIN_VERSION, 
  355.    create, 
  356.    NULL, 
  357.    do_pause, 
  358.    decode, 
  359.    close,
  360.    compress_check, 
  361.    NULL, NULL, NULL, NULL, NULL, NULL, NULL, print_status, 
  362. }; }
  363. /*
  364.  * Use this for audio plugin that has raw file support
  365.  */
  366. #define AUDIO_CODEC_WITH_RAW_FILE_PLUGIN(name, 
  367.                                          create, 
  368.                  do_pause, 
  369.                                          decode, 
  370.                                          print_status, 
  371.                  close,
  372.                  compress_check, 
  373.                  raw_file_check, 
  374.                  raw_file_next_frame, 
  375.                                          raw_file_used_for_frame, 
  376.                  raw_file_seek_to, 
  377.                  raw_file_has_eof)
  378. extern "C" { codec_plugin_t DLL_EXPORT mpeg4ip_codec_plugin = { 
  379.    name, 
  380.    "audio", 
  381.    PLUGIN_VERSION, 
  382.    create, 
  383.    NULL, 
  384.    do_pause, 
  385.    decode, 
  386.    close,
  387.    compress_check, 
  388.    raw_file_check, 
  389.    raw_file_next_frame, 
  390.    raw_file_used_for_frame, 
  391.    raw_file_seek_to, 
  392.    NULL, 
  393.    raw_file_has_eof, NULL, print_status, 
  394. }; }
  395. /*
  396.  * Use this for a video codec without raw file support
  397.  */
  398. #define VIDEO_CODEC_PLUGIN(name, 
  399.                            create, 
  400.    do_pause, 
  401.                            decode, 
  402.                            print_status, 
  403.    close,
  404.    compress_check,
  405.    video_frame_is_sync) 
  406. extern "C" { codec_plugin_t DLL_EXPORT mpeg4ip_codec_plugin = { 
  407.    name, 
  408.    "video", 
  409.    PLUGIN_VERSION, 
  410.    NULL, 
  411.    create, 
  412.    do_pause, 
  413.    decode, 
  414.    close,
  415.    compress_check, 
  416.    NULL, NULL, NULL, NULL, NULL, NULL, video_frame_is_sync, print_status, 
  417. }; }
  418. /*
  419.  * Use this for video codec with raw file support
  420.  */
  421. #define VIDEO_CODEC_WITH_RAW_FILE_PLUGIN(name, 
  422.                                          create, 
  423.                  do_pause, 
  424.                                          decode, 
  425.                                          print_status, 
  426.                  close,
  427.                  compress_check, 
  428.                                          video_frame_is_sync, 
  429.                  raw_file_check, 
  430.                  raw_file_next_frame, 
  431.                                          raw_file_used_for_frame, 
  432.                  raw_file_seek_to, 
  433.                  raw_file_skip_frame, 
  434.                                          raw_file_has_eof) 
  435. extern "C" { codec_plugin_t DLL_EXPORT mpeg4ip_codec_plugin = { 
  436.    name, 
  437.    "video", 
  438.    PLUGIN_VERSION, 
  439.    NULL, 
  440.    create, 
  441.    do_pause, 
  442.    decode, 
  443.    close,
  444.    compress_check, 
  445.    raw_file_check, 
  446.    raw_file_next_frame, 
  447.    raw_file_used_for_frame, 
  448.    raw_file_seek_to, 
  449.    raw_file_skip_frame,
  450.    raw_file_has_eof, 
  451.    video_frame_is_sync, 
  452.    print_status, 
  453. }; }
  454.      
  455.      
  456. #endif