WARNING: The online documentation has moved to https://docs.pjsip.org.

Visit the new documentation at https://docs.pjsip.org:

BLOG | DOCUMENTATION | GITHUB

Home --> Documentations --> PJMEDIA Reference

Samples: Playing AVI File to

Video and Sound Devices

This is a very simple example to use the WAV File Player, Sound Device Port, and Video media port. In this example, we open the file, video, and sound devices, then connect the file to both video and sound devices to play the contents of the file.

This file is pjsip-apps/src/samples/aviplay.c

1/*
2 * Copyright (C) 2010-2011 Teluu Inc. (http://www.teluu.com)
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
19#include <pjmedia.h>
20#include <pjmedia/converter.h>
21#include <pjmedia-codec.h>
22#include <pjlib-util.h>
23#include <pjlib.h>
24#include <stdio.h>
25#include <stdlib.h>
26
27#ifndef _MSC_VER
28#include <signal.h>
29#endif
30
47/*
48 * aviplay.c
49 *
50 * PURPOSE:
51 * Play a AVI file to video and sound devices.
52 *
53 * USAGE:
54 * aviplay FILE.AVI
55 */
56
57
58#if defined(PJMEDIA_HAS_VIDEO) && (PJMEDIA_HAS_VIDEO != 0)
59
60#include "util.h"
61
62/* For logging purpose. */
63#define THIS_FILE "aviplay.c"
64
65static const char *desc =
66" FILE \n"
67" \n"
68" aviplay.c \n"
69" \n"
70" PURPOSE \n"
71" \n"
72" Demonstrate how to play a AVI file. \n"
73" \n"
74" USAGE \n"
75" \n"
76" aviplay FILE.AVI \n";
77
78struct codec_fmt {
79 pj_uint32_t pjmedia_id;
80 const char *codec_id;
81 /* Do we need to convert the decoded frame? */
82 pj_bool_t need_conversion;
83 /* If conversion is needed, dst_fmt indicates the destination format */
84 pjmedia_format_id dst_fmt;
85} codec_fmts[] = {{PJMEDIA_FORMAT_MJPEG, "mjpeg",
87 {PJMEDIA_FORMAT_H263 , "h263" ,
88 PJ_FALSE, 0},
89 {PJMEDIA_FORMAT_MPEG4, "mp4v"},
90 {PJMEDIA_FORMAT_H264 , "h264"}
91 };
92
93typedef struct avi_port_t
94{
95 pjmedia_vid_port *vid_port;
96 pjmedia_snd_port *snd_port;
97 pj_bool_t is_running;
98 pj_bool_t is_quitting;
99} avi_port_t;
100
101typedef struct codec_port_data_t
102{
104 pjmedia_port *src_port;
105 pj_uint8_t *enc_buf;
106 pj_size_t enc_buf_size;
107
108 pjmedia_converter *conv;
109} codec_port_data_t;
110
111static pj_status_t avi_event_cb(pjmedia_event *event,
112 void *user_data)
113{
114 avi_port_t *ap = (avi_port_t *)user_data;
115
116 switch (event->type) {
118 ap->is_quitting = PJ_TRUE;
119 break;
121 if (ap->is_running) {
122 pjmedia_vid_port_stop(ap->vid_port);
123 if (ap->snd_port)
125 pjmedia_snd_port_get_snd_stream(ap->snd_port));
126 } else {
127 pjmedia_vid_port_start(ap->vid_port);
128 if (ap->snd_port)
130 pjmedia_snd_port_get_snd_stream(ap->snd_port));
131 }
132 ap->is_running = !ap->is_running;
133 break;
134 default:
135 return PJ_SUCCESS;
136 }
137
138 /* We handled the event on our own, so return non-PJ_SUCCESS here */
139 return -1;
140}
141
142static pj_status_t codec_get_frame(pjmedia_port *port,
143 pjmedia_frame *frame)
144{
145 codec_port_data_t *port_data = (codec_port_data_t*)port->port_data.pdata;
147 pjmedia_frame enc_frame;
148 pj_status_t status;
149
150 enc_frame.buf = port_data->enc_buf;
151 enc_frame.size = port_data->enc_buf_size;
152
153 if (port_data->conv) {
154 pj_size_t frame_size = frame->size;
155
156 status = pjmedia_port_get_frame(port_data->src_port, frame);
157 if (status != PJ_SUCCESS) goto on_error;
158
159 status = pjmedia_vid_codec_decode(codec, 1, frame,
160 (unsigned)frame->size, &enc_frame);
161 if (status != PJ_SUCCESS) goto on_error;
162
163 frame->size = frame_size;
164 status = pjmedia_converter_convert(port_data->conv, &enc_frame, frame);
165 if (status != PJ_SUCCESS) goto on_error;
166
167 return PJ_SUCCESS;
168 }
169
170 status = pjmedia_port_get_frame(port_data->src_port, &enc_frame);
171 if (status != PJ_SUCCESS) goto on_error;
172
173 status = pjmedia_vid_codec_decode(codec, 1, &enc_frame,
174 (unsigned)frame->size, frame);
175 if (status != PJ_SUCCESS) goto on_error;
176
177 return PJ_SUCCESS;
178
179on_error:
180 pj_perror(3, THIS_FILE, status, "codec_get_frame() error");
181 return status;
182}
183
184static int aviplay(pj_pool_t *pool, const char *fname)
185{
186 pjmedia_vid_port *renderer=NULL;
188 const pjmedia_video_format_info *vfi;
190 pjmedia_snd_port *snd_port = NULL;
191 pj_status_t status;
192 int rc = 0;
193 pjmedia_avi_streams *avi_streams;
194 pjmedia_avi_stream *vid_stream, *aud_stream;
195 pjmedia_port *vid_port = NULL, *aud_port = NULL;
197 codec_port_data_t codec_port_data;
198 avi_port_t avi_port;
199
200 pj_bzero(&avi_port, sizeof(avi_port));
201
202 CHECK( pjmedia_avi_player_create_streams(pool, fname, 0, &avi_streams) );
203
204 vid_stream = pjmedia_avi_streams_get_stream_by_media(avi_streams,
205 0,
207 vid_port = pjmedia_avi_stream_get_port(vid_stream);
208
209 if (vid_port) {
211
214 &param.vidparam) );
215
216 /* Create renderer, set it to active */
217 param.active = PJ_TRUE;
222 PJ_TRUE);
224 vid_port->info.fmt.id,
225 vfd->size.w, vfd->size.h,
226 vfd->fps.num, vfd->fps.denum);
227
230 vid_port->info.fmt.id);
231 /* Check whether the frame is encoded */
232 if (!vfi || vfi->bpp == 0) {
233 /* Yes, prepare codec */
234 pj_str_t codec_id_st;
235 unsigned info_cnt = 1, i, k;
236 const pjmedia_vid_codec_info *codec_info;
237 pj_str_t port_name = {"codec", 5};
238 pj_uint8_t *enc_buf = NULL;
239 pj_size_t enc_buf_size = 0;
240 pjmedia_vid_dev_info rdr_info;
241 pjmedia_port codec_port;
242 pjmedia_vid_codec_param codec_param;
243 struct codec_fmt *codecp = NULL;
244
245 /* Lookup codec */
246 for (i = 0; i < sizeof(codec_fmts)/sizeof(codec_fmts[0]); i++) {
247 if (vid_port->info.fmt.id == codec_fmts[i].pjmedia_id) {
248 codecp = &codec_fmts[i];
249 break;
250 }
251 }
252 if (!codecp) {
253 rc = 242; goto on_return;
254 }
255 pj_cstr(&codec_id_st, codecp->codec_id);
257 &codec_id_st,
258 &info_cnt,
259 &codec_info,
260 NULL) );
261
262 CHECK( pjmedia_vid_codec_mgr_get_default_param(NULL, codec_info,
263 &codec_param) );
264
265 pjmedia_format_copy(&codec_param.enc_fmt, &param.vidparam.fmt);
266
267 pjmedia_vid_dev_get_info(param.vidparam.rend_id, &rdr_info);
268 for (i=0; i<codec_info->dec_fmt_id_cnt; ++i) {
269 for (k=0; k<rdr_info.fmt_cnt; ++k) {
270 if (codec_info->dec_fmt_id[i]==(int)rdr_info.fmt[k].id)
271 {
272 param.vidparam.fmt.id = codec_info->dec_fmt_id[i];
273 i = codec_info->dec_fmt_id_cnt;
274 break;
275 }
276 }
277 }
278
279 /* Open codec */
280 CHECK( pjmedia_vid_codec_mgr_alloc_codec(NULL, codec_info,
281 &codec));
282
283 CHECK( pjmedia_vid_codec_init(codec, pool) );
284
285 pjmedia_format_copy(&codec_param.dec_fmt, &param.vidparam.fmt);
286 codec_param.dir = PJMEDIA_DIR_DECODING;
288 CHECK( pjmedia_vid_codec_open(codec, &codec_param) );
289
290 /* Alloc encoding buffer */
291 enc_buf_size = codec_param.dec_fmt.det.vid.size.w *
292 codec_param.dec_fmt.det.vid.size.h * 4;
293 enc_buf = pj_pool_alloc(pool, enc_buf_size +
294 128 /*< padding, required for vid codecs
295 such as ffmpeg. Must be >=
296 AV_INPUT_BUFFER_PADDING_SIZE.
297 And must not be included in
298 the enc_buf_size calculation
299 above. */);
300
301 /* Init codec port */
302 pj_bzero(&codec_port, sizeof(codec_port));
303 CHECK( pjmedia_port_info_init2(&codec_port.info, &port_name,
304 0x1234,
306 &codec_param.dec_fmt) );
307
308 pj_bzero(&codec_port_data, sizeof(codec_port_data));
309 codec_port_data.codec = codec;
310 codec_port_data.src_port = vid_port;
311 codec_port_data.enc_buf = enc_buf;
312 codec_port_data.enc_buf_size = enc_buf_size;
313
314 codec_port.get_frame = &codec_get_frame;
315 codec_port.port_data.pdata = &codec_port_data;
316
317 /* Check whether we need to convert the decoded frame */
318 if (codecp->need_conversion) {
319 pjmedia_conversion_param conv_param;
320
321 pjmedia_format_copy(&conv_param.src, &param.vidparam.fmt);
322 pjmedia_format_copy(&conv_param.dst, &param.vidparam.fmt);
323 conv_param.dst.id = codecp->dst_fmt;
324 param.vidparam.fmt.id = conv_param.dst.id;
325
326 CHECK( pjmedia_converter_create(NULL, pool, &conv_param,
327 &codec_port_data.conv));
328 }
329
330 CHECK( pjmedia_vid_port_create(pool, &param, &renderer) );
331
332 CHECK( pjmedia_vid_port_connect(renderer, &codec_port,
333 PJ_FALSE) );
334 } else {
335 CHECK( pjmedia_vid_port_create(pool, &param, &renderer) );
336
337 /* Connect avi port to renderer */
338 CHECK( pjmedia_vid_port_connect(renderer, vid_port,
339 PJ_FALSE) );
340 }
341
342 }
343
344 aud_stream = pjmedia_avi_streams_get_stream_by_media(avi_streams,
345 0,
347 aud_port = pjmedia_avi_stream_get_port(aud_stream);
348
349 if (aud_port) {
350 /* Create sound player port. */
352 pool, /* pool */
353 -1, /* use default dev. */
354 PJMEDIA_PIA_SRATE(&aud_port->info),/* clock rate. */
355 PJMEDIA_PIA_CCNT(&aud_port->info), /* # of channels. */
356 PJMEDIA_PIA_SPF(&aud_port->info), /* samples per frame. */
357 PJMEDIA_PIA_BITS(&aud_port->info), /* bits per sample. */
358 0, /* options */
359 &snd_port /* returned port */
360 ));
361
362 /* Connect file port to the sound player.
363 * Stream playing will commence immediately.
364 */
365 CHECK( pjmedia_snd_port_connect(snd_port, aud_port) );
366 }
367
368 if (vid_port) {
370
371 pj_bzero(&cb, sizeof(cb));
372 avi_port.snd_port = snd_port;
373 avi_port.vid_port = renderer;
374 avi_port.is_running = PJ_TRUE;
375 pjmedia_vid_port_set_cb(renderer, &cb, &avi_port);
376
377 /* subscribe events */
378 pjmedia_event_subscribe(NULL, &avi_event_cb, &avi_port,
379 renderer);
380
381 if (snd_port) {
382 /* Synchronize video rendering and audio playback */
384 renderer,
386 snd_port, PJMEDIA_DIR_PLAYBACK));
387 }
388
389
390 /* Start video streaming.. */
391 CHECK( pjmedia_vid_port_start(renderer) );
392 }
393
394 while (!avi_port.is_quitting) {
395 pj_thread_sleep(100);
396 }
397
398on_error:
399on_return:
400 if (snd_port) {
402 /* Without this sleep, Windows/DirectSound will repeteadly
403 * play the last frame during destroy.
404 */
405 pj_thread_sleep(100);
406 pjmedia_snd_port_destroy(snd_port);
407 }
408 if (renderer) {
409 pjmedia_event_unsubscribe(NULL, &avi_event_cb, &avi_port,
410 renderer);
411 pjmedia_vid_port_destroy(renderer);
412 }
413 if (aud_port)
414 pjmedia_port_destroy(aud_port);
415 if (vid_port)
416 pjmedia_port_destroy(vid_port);
417 if (codec) {
420 }
421
422 return rc;
423}
424
425#ifndef _MSC_VER
426static void sig_handler(int sig)
427{
428 switch (sig)
429 {
430 case SIGINT:
431 case SIGTERM:
432 break;
433 }
434 puts("exit..");
435 exit(1);
436}
437#endif
438
439static int main_func(int argc, char *argv[])
440{
442 pj_pool_t *pool;
443 int rc = 0;
444 pj_status_t status = PJ_SUCCESS;
445
446 if (argc != 2) {
447 puts("Error: filename required");
448 puts(desc);
449 return 110;
450 }
451
452#ifndef _MSC_VER
453 signal(SIGINT, sig_handler);
454 signal(SIGTERM, sig_handler);
455#endif
456
457 /* Must init PJLIB first: */
458 status = pj_init();
459 PJ_ASSERT_RETURN(status == PJ_SUCCESS, 120);
460
461 /* Must create a pool factory before we can allocate any memory. */
463
464 /* Create memory pool for our file player */
465 pool = pj_pool_create( &cp.factory, /* pool factory */
466 "AVI", /* pool name. */
467 4000, /* init size */
468 4000, /* increment size */
469 NULL /* callback on error */
470 );
471
472 pjmedia_video_format_mgr_create(pool, 64, 0, NULL);
474 pjmedia_event_mgr_create(pool, 0, NULL);
476
478 if (status != PJ_SUCCESS) {
479 app_perror(THIS_FILE, "Video init failed", status);
480 rc = 130;
481 goto on_return;
482 }
483
484 status = pjmedia_aud_subsys_init(&cp.factory);
485 if (status != PJ_SUCCESS) {
486 rc = 140;
487 goto on_return;
488 }
489
490#if defined(PJMEDIA_HAS_OPENH264_CODEC) && PJMEDIA_HAS_OPENH264_CODEC != 0
491 status = pjmedia_codec_openh264_vid_init(NULL, &cp.factory);
492 if (status != PJ_SUCCESS) {
493 rc = 150;
494 goto on_return;
495 }
496#endif
497
498#if PJMEDIA_HAS_FFMPEG_VID_CODEC
499 status = pjmedia_codec_ffmpeg_vid_init(NULL, &cp.factory);
500 if (status != PJ_SUCCESS) {
501 rc = 160;
502 goto on_return;
503 }
504#endif
505
506 rc = aviplay(pool, argv[1]);
507
508 /*
509 * File should be playing and looping now
510 */
511
512 /* Without this sleep, Windows/DirectSound will repeteadly
513 * play the last frame during destroy.
514 */
515 pj_thread_sleep(100);
516
517on_return:
518#if PJMEDIA_HAS_FFMPEG_VID_CODEC
520#endif
521#if defined(PJMEDIA_HAS_OPENH264_CODEC) && PJMEDIA_HAS_OPENH264_CODEC != 0
523#endif
526
531
532 /* Release application pool */
533 pj_pool_release( pool );
534
535 /* Destroy pool factory */
537
538 /* Shutdown PJLIB */
539 pj_shutdown();
540
541 /* Done. */
542 return rc;
543}
544
545int main(int argc, char *argv[])
546{
547 return pj_run_app(&main_func, argc, argv, 0);
548}
549
550#else
551
552int main(int argc, char *argv[])
553{
554 PJ_UNUSED_ARG(argc);
555 PJ_UNUSED_ARG(argv);
556 puts("Error: this sample requires video capability (PJMEDIA_HAS_VIDEO == 1)");
557 return -1;
558}
559
560#endif /* PJMEDIA_HAS_VIDEO */
Format conversion utilities.
pj_status_t pjmedia_aud_stream_stop(pjmedia_aud_stream *strm)
pj_status_t pjmedia_aud_stream_start(pjmedia_aud_stream *strm)
pj_status_t pjmedia_aud_subsys_shutdown(void)
pj_status_t pjmedia_aud_subsys_init(pj_pool_factory *pf)
struct pjmedia_avi_streams pjmedia_avi_streams
Definition: avi_stream.h:60
pjmedia_avi_stream * pjmedia_avi_streams_get_stream_by_media(pjmedia_avi_streams *streams, unsigned start_idx, pjmedia_type media_type)
pj_status_t pjmedia_avi_player_create_streams(pj_pool_t *pool, const char *filename, unsigned flags, pjmedia_avi_streams **p_streams)
pjmedia_port * pjmedia_avi_stream_get_port(pjmedia_avi_stream *stream)
Definition: avi_stream.h:124
pj_status_t pjmedia_codec_openh264_vid_init(pjmedia_vid_codec_mgr *mgr, pj_pool_factory *pf)
pj_status_t pjmedia_codec_openh264_vid_deinit(void)
pj_status_t pjmedia_codec_ffmpeg_vid_deinit(void)
pj_status_t pjmedia_codec_ffmpeg_vid_init(pjmedia_vid_codec_mgr *mgr, pj_pool_factory *pf)
pj_status_t pjmedia_converter_mgr_create(pj_pool_t *pool, pjmedia_converter_mgr **mgr)
pj_status_t pjmedia_converter_convert(pjmedia_converter *cv, pjmedia_frame *src_frame, pjmedia_frame *dst_frame)
pj_status_t pjmedia_converter_create(pjmedia_converter_mgr *mgr, pj_pool_t *pool, pjmedia_conversion_param *param, pjmedia_converter **p_cv)
void pjmedia_converter_mgr_destroy(pjmedia_converter_mgr *mgr)
pjmedia_converter_mgr * pjmedia_converter_mgr_instance(void)
pj_status_t pjmedia_event_mgr_create(pj_pool_t *pool, unsigned options, pjmedia_event_mgr **mgr)
void pjmedia_event_mgr_destroy(pjmedia_event_mgr *mgr)
pj_status_t pjmedia_event_unsubscribe(pjmedia_event_mgr *mgr, pjmedia_event_cb *cb, void *user_data, void *epub)
pj_status_t pjmedia_event_subscribe(pjmedia_event_mgr *mgr, pjmedia_event_cb *cb, void *user_data, void *epub)
pjmedia_event_mgr * pjmedia_event_mgr_instance(void)
@ PJMEDIA_EVENT_MOUSE_BTN_DOWN
Definition: event.h:72
@ PJMEDIA_EVENT_WND_CLOSED
Definition: event.h:62
void pjmedia_video_format_mgr_destroy(pjmedia_video_format_mgr *mgr)
const pjmedia_video_format_info * pjmedia_get_video_format_info(pjmedia_video_format_mgr *mgr, pj_uint32_t id)
pjmedia_format_id
Definition: format.h:55
void pjmedia_format_init_video(pjmedia_format *fmt, pj_uint32_t fmt_id, unsigned width, unsigned height, unsigned fps_num, unsigned fps_denum)
pjmedia_video_format_mgr * pjmedia_video_format_mgr_instance(void)
pjmedia_format * pjmedia_format_copy(pjmedia_format *dst, const pjmedia_format *src)
pjmedia_video_format_detail * pjmedia_format_get_video_format_detail(const pjmedia_format *fmt, pj_bool_t assert_valid)
pj_status_t pjmedia_video_format_mgr_create(pj_pool_t *pool, unsigned max_fmt, unsigned options, pjmedia_video_format_mgr **p_mgr)
@ PJMEDIA_FORMAT_I420
Definition: format.h:163
pj_status_t pjmedia_port_destroy(pjmedia_port *port)
unsigned PJMEDIA_PIA_BITS(const pjmedia_port_info *pia)
Definition: port.h:283
pj_status_t pjmedia_port_info_init2(pjmedia_port_info *info, const pj_str_t *name, unsigned signature, pjmedia_dir dir, const pjmedia_format *fmt)
unsigned PJMEDIA_PIA_SPF(const pjmedia_port_info *pia)
Definition: port.h:311
unsigned PJMEDIA_PIA_CCNT(const pjmedia_port_info *pia)
Definition: port.h:270
pj_status_t pjmedia_port_get_frame(pjmedia_port *port, pjmedia_frame *frame)
unsigned PJMEDIA_PIA_SRATE(const pjmedia_port_info *pia)
Definition: port.h:257
@ PJMEDIA_TYPE_AUDIO
Definition: pjmedia/types.h:59
@ PJMEDIA_TYPE_VIDEO
Definition: pjmedia/types.h:62
@ PJMEDIA_DIR_PLAYBACK
Definition: pjmedia/types.h:166
@ PJMEDIA_DIR_RENDER
Definition: pjmedia/types.h:169
@ PJMEDIA_DIR_ENCODING
Definition: pjmedia/types.h:157
@ PJMEDIA_DIR_DECODING
Definition: pjmedia/types.h:163
void pjmedia_vid_port_destroy(pjmedia_vid_port *vid_port)
pj_status_t pjmedia_vid_port_connect(pjmedia_vid_port *vid_port, pjmedia_port *port, pj_bool_t destroy)
struct pjmedia_vid_port pjmedia_vid_port
Definition: vid_port.h:68
pj_status_t pjmedia_vid_port_create(pj_pool_t *pool, const pjmedia_vid_port_param *prm, pjmedia_vid_port **p_vp)
void pjmedia_vid_port_param_default(pjmedia_vid_port_param *prm)
pj_status_t pjmedia_vid_port_start(pjmedia_vid_port *vid_port)
pj_status_t pjmedia_vid_port_set_clock_src(pjmedia_vid_port *vid_port, pjmedia_clock_src *clocksrc)
pj_status_t pjmedia_vid_port_stop(pjmedia_vid_port *vid_port)
void pjmedia_vid_port_set_cb(pjmedia_vid_port *vid_port, const pjmedia_vid_dev_cb *cb, void *user_data)
pj_status_t pjmedia_vid_codec_mgr_get_default_param(pjmedia_vid_codec_mgr *mgr, const pjmedia_vid_codec_info *info, pjmedia_vid_codec_param *param)
pj_status_t pjmedia_vid_codec_mgr_destroy(pjmedia_vid_codec_mgr *mgr)
pj_status_t pjmedia_vid_codec_mgr_dealloc_codec(pjmedia_vid_codec_mgr *mgr, pjmedia_vid_codec *codec)
pj_status_t pjmedia_vid_codec_open(pjmedia_vid_codec *codec, pjmedia_vid_codec_param *param)
Definition: vid_codec.h:686
pjmedia_vid_codec_mgr * pjmedia_vid_codec_mgr_instance(void)
pj_status_t pjmedia_vid_codec_mgr_alloc_codec(pjmedia_vid_codec_mgr *mgr, const pjmedia_vid_codec_info *info, pjmedia_vid_codec **p_codec)
pj_status_t pjmedia_vid_codec_decode(pjmedia_vid_codec *codec, pj_size_t pkt_count, pjmedia_frame packets[], unsigned out_size, pjmedia_frame *output)
Definition: vid_codec.h:825
pj_status_t pjmedia_vid_codec_mgr_find_codecs_by_id(pjmedia_vid_codec_mgr *mgr, const pj_str_t *codec_id, unsigned *count, const pjmedia_vid_codec_info *p_info[], unsigned prio[])
pj_status_t pjmedia_vid_codec_close(pjmedia_vid_codec *codec)
Definition: vid_codec.h:701
pj_status_t pjmedia_vid_codec_mgr_create(pj_pool_t *pool, pjmedia_vid_codec_mgr **mgr)
pj_status_t pjmedia_vid_codec_init(pjmedia_vid_codec *codec, pj_pool_t *pool)
Definition: vid_codec.h:667
@ PJMEDIA_VID_PACKING_WHOLE
Definition: vid_codec.h:74
pj_status_t pjmedia_snd_port_connect(pjmedia_snd_port *snd_port, pjmedia_port *port)
pjmedia_clock_src * pjmedia_snd_port_get_clock_src(pjmedia_snd_port *snd_port, pjmedia_dir dir)
pj_status_t pjmedia_snd_port_disconnect(pjmedia_snd_port *snd_port)
pj_status_t pjmedia_snd_port_create_player(pj_pool_t *pool, int index, unsigned clock_rate, unsigned channel_count, unsigned samples_per_frame, unsigned bits_per_sample, unsigned options, pjmedia_snd_port **p_port)
pj_status_t pjmedia_snd_port_destroy(pjmedia_snd_port *snd_port)
pjmedia_aud_stream * pjmedia_snd_port_get_snd_stream(pjmedia_snd_port *snd_port)
struct pjmedia_snd_port pjmedia_snd_port
Definition: sound_port.h:145
int pj_run_app(pj_main_func_ptr main_func, int argc, char *argv[], unsigned flags)
unsigned char pj_uint8_t
pj_status_t pj_init(void)
int pj_bool_t
size_t pj_size_t
int pj_status_t
void pj_shutdown(void)
unsigned int pj_uint32_t
PJ_SUCCESS
PJ_TRUE
PJ_FALSE
void pj_caching_pool_destroy(pj_caching_pool *ch_pool)
void pj_caching_pool_init(pj_caching_pool *ch_pool, const pj_pool_factory_policy *policy, pj_size_t max_capacity)
pj_pool_factory_policy pj_pool_factory_default_policy
void * pj_pool_alloc(pj_pool_t *pool, pj_size_t size)
pj_pool_t * pj_pool_create(pj_pool_factory *factory, const char *name, pj_size_t initial_size, pj_size_t increment_size, pj_pool_callback *callback)
void pj_pool_release(pj_pool_t *pool)
const pj_str_t * pj_cstr(pj_str_t *str, const char *s)
void pj_bzero(void *dst, pj_size_t size)
pj_status_t pj_thread_sleep(unsigned msec)
#define PJ_ASSERT_RETURN(expr, retval)
#define PJ_UNUSED_ARG(arg)
void pj_perror(int log_level, const char *sender, pj_status_t status, const char *title_fmt,...)
pj_status_t pjmedia_vid_dev_default_param(pj_pool_t *pool, pjmedia_vid_dev_index id, pjmedia_vid_dev_param *param)
pj_status_t pjmedia_vid_dev_subsys_shutdown(void)
pj_status_t pjmedia_vid_dev_subsys_init(pj_pool_factory *pf)
pj_status_t pjmedia_vid_dev_get_info(pjmedia_vid_dev_index id, pjmedia_vid_dev_info *info)
@ PJMEDIA_VID_DEV_WND_RESIZABLE
Definition: pjmedia/videodev.h:137
@ PJMEDIA_VID_DEV_WND_BORDER
Definition: pjmedia/videodev.h:132
@ PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS
Definition: pjmedia/videodev.h:298
@ PJMEDIA_VID_DEFAULT_RENDER_DEV
Definition: pjmedia/videodev.h:155
Include all codecs API in PJMEDIA-CODEC.
PJMEDIA main header file.
Definition: siprtp.c:101
pj_pool_factory factory
Definition: converter.h:47
pjmedia_format dst
Definition: converter.h:49
pjmedia_format src
Definition: converter.h:48
Definition: converter.h:115
Definition: event.h:238
pjmedia_event_type type
Definition: event.h:242
union pjmedia_format::@11 det
pj_uint32_t id
Definition: format.h:303
pjmedia_video_format_detail vid
Definition: format.h:328
Definition: frame.h:56
void * buf
Definition: frame.h:58
pj_size_t size
Definition: frame.h:59
void * pdata
Definition: port.h:385
pjmedia_format fmt
Definition: port.h:247
Definition: port.h:378
pjmedia_port_info info
Definition: port.h:379
pj_status_t(* get_frame)(struct pjmedia_port *this_port, pjmedia_frame *frame)
Definition: port.h:415
int denum
Definition: pjmedia/types.h:218
unsigned h
Definition: pjmedia/types.h:236
unsigned w
Definition: pjmedia/types.h:235
Definition: vid_codec.h:114
unsigned dec_fmt_id_cnt
Definition: vid_codec.h:121
pjmedia_format_id dec_fmt_id[8]
Definition: vid_codec.h:123
Definition: vid_codec.h:148
pjmedia_dir dir
Definition: vid_codec.h:149
pjmedia_format dec_fmt
Definition: vid_codec.h:156
pjmedia_vid_packing packing
Definition: vid_codec.h:150
pjmedia_format enc_fmt
Definition: vid_codec.h:152
Definition: vid_codec.h:271
Definition: pjmedia/videodev.h:362
Definition: pjmedia/videodev.h:316
unsigned fmt_cnt
Definition: pjmedia/videodev.h:345
pjmedia_format fmt[PJMEDIA_VID_DEV_INFO_FMT_CNT]
Definition: pjmedia/videodev.h:353
pjmedia_format fmt
Definition: pjmedia/videodev.h:447
pjmedia_dir dir
Definition: pjmedia/videodev.h:412
unsigned flags
Definition: pjmedia/videodev.h:442
pjmedia_vid_dev_index rend_id
Definition: pjmedia/videodev.h:424
unsigned window_flags
Definition: pjmedia/videodev.h:492
Definition: vid_port.h:42
pjmedia_vid_dev_param vidparam
Definition: vid_port.h:46
pj_bool_t active
Definition: vid_port.h:61
Definition: format.h:275
pjmedia_rect_size size
Definition: format.h:276
pjmedia_ratio fps
Definition: format.h:277
Definition: format.h:413
pj_uint8_t bpp
Definition: format.h:434
Definition: confbench.c:135

 


PJMEDIA small footprint Open Source media stack
Copyright (C) 2006-2008 Teluu Inc.