Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
rtpenc_chain.c
Go to the documentation of this file.
1
/*
2
* RTP muxer chaining code
3
* Copyright (c) 2010 Martin Storsjo
4
*
5
* This file is part of Libav.
6
*
7
* Libav is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* Libav is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
avformat.h
"
23
#include "
avio_internal.h
"
24
#include "
rtpenc_chain.h
"
25
#include "
avio_internal.h
"
26
#include "
rtp.h
"
27
#include "
libavutil/opt.h
"
28
29
int
ff_rtp_chain_mux_open
(
AVFormatContext
**
out
,
AVFormatContext
*s,
30
AVStream
*
st
,
URLContext
*handle,
int
packet_size,
31
int
idx)
32
{
33
AVFormatContext
*rtpctx =
NULL
;
34
int
ret;
35
AVOutputFormat
*rtp_format =
av_guess_format
(
"rtp"
,
NULL
,
NULL
);
36
uint8_t
*rtpflags;
37
AVDictionary
*opts =
NULL
;
38
39
if
(!rtp_format) {
40
ret =
AVERROR
(ENOSYS);
41
goto
fail;
42
}
43
44
/* Allocate an AVFormatContext for each output stream */
45
rtpctx =
avformat_alloc_context
();
46
if
(!rtpctx) {
47
ret =
AVERROR
(ENOMEM);
48
goto
fail;
49
}
50
51
rtpctx->
oformat
= rtp_format;
52
if
(!
avformat_new_stream
(rtpctx,
NULL
)) {
53
ret =
AVERROR
(ENOMEM);
54
goto
fail;
55
}
56
/* Pass the interrupt callback on */
57
rtpctx->
interrupt_callback
= s->
interrupt_callback
;
58
/* Copy the max delay setting; the rtp muxer reads this. */
59
rtpctx->
max_delay
= s->
max_delay
;
60
/* Copy other stream parameters. */
61
rtpctx->
streams
[0]->
sample_aspect_ratio
= st->
sample_aspect_ratio
;
62
/* Get the payload type from the codec */
63
if
(st->
id
<
RTP_PT_PRIVATE
)
64
rtpctx->
streams
[0]->
id
=
65
ff_rtp_get_payload_type
(s, st->
codec
, idx);
66
else
67
rtpctx->
streams
[0]->
id
= st->
id
;
68
69
if
(
av_opt_get
(s,
"rtpflags"
,
AV_OPT_SEARCH_CHILDREN
, &rtpflags) >= 0)
70
av_dict_set
(&opts,
"rtpflags"
, rtpflags,
AV_DICT_DONT_STRDUP_VAL
);
71
72
/* Set the synchronized start time. */
73
rtpctx->
start_time_realtime
= s->
start_time_realtime
;
74
75
avcodec_copy_context
(rtpctx->
streams
[0]->
codec
, st->
codec
);
76
77
if
(handle) {
78
ret =
ffio_fdopen
(&rtpctx->
pb
, handle);
79
if
(ret < 0)
80
ffurl_close
(handle);
81
}
else
82
ret =
ffio_open_dyn_packet_buf
(&rtpctx->
pb
, packet_size);
83
if
(!ret)
84
ret =
avformat_write_header
(rtpctx, &opts);
85
av_dict_free
(&opts);
86
87
if
(ret) {
88
if
(handle && rtpctx->
pb
) {
89
avio_close
(rtpctx->
pb
);
90
}
else
if
(rtpctx->
pb
) {
91
uint8_t
*ptr;
92
avio_close_dyn_buf
(rtpctx->
pb
, &ptr);
93
av_free
(ptr);
94
}
95
avformat_free_context
(rtpctx);
96
return
ret;
97
}
98
99
*out = rtpctx;
100
return
0;
101
102
fail:
103
av_free
(rtpctx);
104
if
(handle)
105
ffurl_close
(handle);
106
return
ret;
107
}
Generated on Sun Jun 1 2014 17:55:37 for Libav by
1.8.1.2