diff options
-rw-r--r-- | pjmedia/include/pjmedia/mp3_port.h | 14 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/mp3_writer.c | 6 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 25 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 14 |
4 files changed, 35 insertions, 24 deletions
diff --git a/pjmedia/include/pjmedia/mp3_port.h b/pjmedia/include/pjmedia/mp3_port.h index 4d980b9c..279ab1ab 100644 --- a/pjmedia/include/pjmedia/mp3_port.h +++ b/pjmedia/include/pjmedia/mp3_port.h @@ -59,13 +59,21 @@ PJ_BEGIN_DECL */ typedef struct pjmedia_mp3_encoder_option { - /** Specify whether variable bit rate should be used (say Yes!). */ + /** Specify whether variable bit rate should be used. Variable bitrate + * would normally produce better quality at the expense of probably + * larger file. + */ pj_bool_t vbr; - /** Target bitrate, in bps. If zero, bitrate will be calculated. */ + /** Target bitrate, in bps. For VBR, if the bitrate is specified, then + * the encoder will ignore the quality settings and instead will try to + * limit the bitrate to the desired value in this setting. + */ unsigned bit_rate; - /** Encoding quality, 0-9, with 0 is the highest. */ + /** Encoding quality, 0-9, with 0 is the highest quality. For VBR, the + * quality setting will only take effect when bit_rate setting is zero. + */ unsigned quality; } pjmedia_mp3_encoder_option; diff --git a/pjmedia/src/pjmedia/mp3_writer.c b/pjmedia/src/pjmedia/mp3_writer.c index 5506f52b..74098ff4 100644 --- a/pjmedia/src/pjmedia/mp3_writer.c +++ b/pjmedia/src/pjmedia/mp3_writer.c @@ -199,7 +199,7 @@ static pj_status_t init_mp3_encoder(struct mp3_file_port *fport, } else { LConfig.format.LHV1.nVbrMethod = VBR_METHOD_DEFAULT; LConfig.format.LHV1.bWriteVBRHeader = 1; - //LConfig.format.LHV1.dwVbrAbr_bps = fport->mp3_option.bit_rate; + LConfig.format.LHV1.dwVbrAbr_bps = fport->mp3_option.bit_rate; LConfig.format.LHV1.bEnableVBR = 1; } @@ -294,8 +294,8 @@ pjmedia_mp3_writer_port_create( pj_pool_t *pool, fport->mp3_option.vbr = PJ_TRUE; } - /* Calculate bitrate if it's not specified */ - if (fport->mp3_option.bit_rate == 0) + /* Calculate bitrate if it's not specified, only if it's not VBR. */ + if (fport->mp3_option.bit_rate == 0 && !fport->mp3_option.vbr) fport->mp3_option.bit_rate = sampling_rate * channel_count; /* Set default quality if it's not specified */ diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index 8eeceed8..efdf9f4c 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -2529,27 +2529,32 @@ PJ_DECL(pj_status_t) pjsua_player_destroy(pjsua_player_id id); /** * Create a file recorder, and automatically connect this recorder to - * the conference bridge. + * the conference bridge. The recorder currently supports recording WAV file, + * and on Windows, MP3 file. The type of the recorder to use is determined + * by the extension of the file (e.g. ".wav" or ".mp3"). * * @param filename Output file name. The function will determine the * default format to be used based on the file extension. * Currently ".wav" is supported on all platforms, and * also ".mp3" is support on Windows. - * @param file_format This option is obsolete. - * @param encoding Optionally specify the encoding to be applied to the - * file. By default (if NULL is specified), the encoding - * is determined from the file extension (i.e. 16bit PCM - * is used for the WAV files). - * @param max_size Maximum file size. Specify -1 to remove size - * limitation. + * @param enc_type Optionally specify the type of encoder to be used to + * compress the media, if the file can support different + * encodings. This value must be zero for now. + * @param enc_param Optionally specify codec specific parameter to be + * passed to the file writer. For .MP3 recorder, this + * can point to pjmedia_mp3_encoder_option structure to + * specify additional settings for the .mp3 recorder. + * For .WAV recorder, this value must be NULL. + * @param max_size Maximum file size. Specify zero or -1 to remove size + * limitation. This value must be zero or -1 for now. * @param options Optional options. * @param p_id Pointer to receive the recorder instance. * * @return PJ_SUCCESS on success, or the appropriate error code. */ PJ_DECL(pj_status_t) pjsua_recorder_create(const pj_str_t *filename, - unsigned file_format, - const pj_str_t *encoding, + unsigned enc_type, + void *enc_param, pj_ssize_t max_size, unsigned options, pjsua_recorder_id *p_id); diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index c94265d0..b040ff84 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -796,8 +796,8 @@ PJ_DEF(pj_status_t) pjsua_player_destroy(pjsua_player_id id) * the conference bridge. */ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename, - unsigned file_format, - const pj_str_t *encoding, + unsigned enc_type, + void *enc_param, pj_ssize_t max_size, unsigned options, pjsua_recorder_id *p_id) @@ -811,6 +811,7 @@ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename, unsigned slot, file_id; char path[128]; pj_str_t ext; + int file_format; pjmedia_port *port; pj_status_t status; @@ -820,11 +821,8 @@ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename, /* Don't support max_size at present */ PJ_ASSERT_RETURN(max_size == 0 || max_size == -1, PJ_EINVAL); - /* Don't support file format at present */ - PJ_ASSERT_RETURN(file_format == 0, PJ_EINVAL); - - /* Don't support encoding at present */ - PJ_ASSERT_RETURN(encoding == NULL, PJ_EINVAL); + /* Don't support encoding type at present */ + PJ_ASSERT_RETURN(enc_type == 0, PJ_EINVAL); if (pjsua_var.rec_cnt >= PJ_ARRAY_SIZE(pjsua_var.recorder)) return PJ_ETOOMANY; @@ -874,7 +872,7 @@ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename, pjsua_var.mconf_cfg.channel_count, pjsua_var.mconf_cfg.samples_per_frame, pjsua_var.mconf_cfg.bits_per_sample, - NULL, &port); + enc_param, &port); } else { port = NULL; status = PJ_ENOTSUP; |