/* 
 * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#ifndef __PJMEDIA_VID_CODEC_UTIL_H__
#define __PJMEDIA_VID_CODEC_UTIL_H__


/**
 * @file vid_codec_util.h
 * @brief Video codec utilities.
 */

#include <pjmedia/vid_codec.h>
#include <pjmedia/sdp_neg.h>

PJ_BEGIN_DECL


/**
 * Definition of H.263 parameters.
 */
typedef struct pjmedia_vid_codec_h263_fmtp
{
    unsigned mpi_cnt;               /**< # of parsed MPI param              */
    struct mpi {
        pjmedia_rect_size   size;   /**< Picture size/resolution            */
        unsigned            val;    /**< MPI value                          */
    } mpi[32];                      /**< Minimum Picture Interval parameter */

} pjmedia_vid_codec_h263_fmtp;


/**
 * Parse SDP fmtp of H.263.
 *
 * @param fmtp          The H.263 SDP fmtp to be parsed.
 * @param h263_fmtp     The parsing result.
 *
 * @return              PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_vid_codec_h263_parse_fmtp(
                                const pjmedia_codec_fmtp *fmtp,
                                pjmedia_vid_codec_h263_fmtp *h263_fmtp);


/**
 * Parse, negotiate, and apply the encoding and decoding SDP fmtp of H.263
 * in the specified codec parameter.
 *
 * @param param         The codec parameter.
 *
 * @return              PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_vid_codec_h263_apply_fmtp(
                                pjmedia_vid_codec_param *param);


/**
 * Definition of H.264 parameters.
 */
typedef struct pjmedia_vid_codec_h264_fmtp
{
    /* profile-level-id */
    pj_uint8_t      profile_idc;    /**< Profile ID                         */
    pj_uint8_t      profile_iop;    /**< Profile constraints bits           */
    pj_uint8_t      level;          /**< Level                              */

    /* packetization-mode */
    pj_uint8_t      packetization_mode; /**< Packetization mode             */

    /* max-mbps, max-fs, max-cpb, max-dpb, and max-br */
    unsigned        max_mbps;       /**< Max macroblock processing rate     */
    unsigned        max_fs;         /**< Max frame size (in macroblocks)    */
    unsigned        max_cpb;        /**< Max coded picture buffer size      */
    unsigned        max_dpb;        /**< Max decoded picture buffer size    */
    unsigned        max_br;         /**< Max video bit rate                 */

    /* sprop-parameter-sets, in NAL units */
    pj_size_t       sprop_param_sets_len;   /**< Parameter set length       */
    pj_uint8_t      sprop_param_sets[256];  /**< Parameter set (SPS & PPS),
                                                 in NAL unit bitstream      */

} pjmedia_vid_codec_h264_fmtp;


/**
 * Parse SDP fmtp of H.264.
 *
 * @param fmtp          The H.264 SDP fmtp to be parsed.
 * @param h264_fmtp     The parsing result.
 *
 * @return              PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_vid_codec_h264_parse_fmtp(
                                const pjmedia_codec_fmtp *fmtp,
                                pjmedia_vid_codec_h264_fmtp *h264_fmtp);


/**
 * Match H.264 format in the SDP media offer and answer. This will compare
 * H.264 identifier parameters in SDP fmtp, i.e: "profile-level-id" and
 * "packetization-mode" fields. For better interoperability, when the option
 * #PJMEDIA_SDP_NEG_FMT_MATCH_ALLOW_MODIFY_ANSWER is set, this function
 * may update the answer so the parameters in the answer match to ones
 * in the offer.
 *
 * @param pool          The memory pool.
 * @param offer         The SDP media offer.
 * @param o_fmt_idx     Index of the H.264 format in the SDP media offer.
 * @param answer        The SDP media answer.
 * @param a_fmt_idx     Index of the H.264 format in the SDP media answer.
 * @param option        The format matching option, see
 *                      #pjmedia_sdp_neg_fmt_match_flag.
 *
 * @return              PJ_SUCCESS when the formats in offer and answer match.
 */
PJ_DECL(pj_status_t) pjmedia_vid_codec_h264_match_sdp(
                                                pj_pool_t *pool,
                                                pjmedia_sdp_media *offer,
                                                unsigned o_fmt_idx,
                                                pjmedia_sdp_media *answer,
                                                unsigned a_fmt_idx,
                                                unsigned option);


/**
 * Parse and apply the encoding and decoding SDP fmtp of H.264 in the
 * specified codec parameter. This will validate size and fps to conform
 * to H.264 level specified in SDP fmtp "profile-level-id".
 *
 * @param param         The codec parameter.
 *
 * @return              PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_vid_codec_h264_apply_fmtp(
                                pjmedia_vid_codec_param *param);


/**
 * Definition of VPX parameters.
 */
typedef struct pjmedia_vid_codec_vpx_fmtp
{
    unsigned        max_fr;         /**< Max frame rate                     */
    unsigned        max_fs;         /**< Max frame size (in macroblocks)    */
    pj_uint8_t      profile_id;     /**< Profile ID                         */
} pjmedia_vid_codec_vpx_fmtp;


/**
 * Parse SDP fmtp of VPX.
 *
 * @param fmtp          The VPX SDP fmtp to be parsed.
 * @param vpx_fmtp      The parsing result.
 *
 * @return              PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_vid_codec_vpx_parse_fmtp(
                                const pjmedia_codec_fmtp *fmtp,
                                pjmedia_vid_codec_vpx_fmtp *vpx_fmtp);


/**
 * Parse and apply the encoding and decoding SDP fmtp of VPX in the
 * specified codec parameter. This will validate size and fps to conform
 * to VPX level specified in SDP fmtp "max-fr" and "max-fs".
 *
 * @param param         The codec parameter.
 *
 * @return              PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_vid_codec_vpx_apply_fmtp(
                                pjmedia_vid_codec_param *param);


PJ_END_DECL


#endif  /* __PJMEDIA_VID_CODEC_UTIL_H__ */
