FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
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 FFmpeg.
6
*
7
* FFmpeg 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
* FFmpeg 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 FFmpeg; 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
rtpctx->
flags
|= s->
flags
&
AVFMT_FLAG_MP4A_LATM
;
63
64
/* Get the payload type from the codec */
65
if
(st->
id
<
RTP_PT_PRIVATE
)
66
rtpctx->
streams
[0]->
id
=
67
ff_rtp_get_payload_type
(s, st->
codec
, idx);
68
else
69
rtpctx->
streams
[0]->
id
= st->
id
;
70
71
72
if
(
av_opt_get
(s,
"rtpflags"
,
AV_OPT_SEARCH_CHILDREN
, &rtpflags) >= 0)
73
av_dict_set
(&opts,
"rtpflags"
, rtpflags,
AV_DICT_DONT_STRDUP_VAL
);
74
75
/* Set the synchronized start time. */
76
rtpctx->
start_time_realtime
= s->
start_time_realtime
;
77
78
avcodec_copy_context
(rtpctx->
streams
[0]->
codec
, st->
codec
);
79
80
if
(handle) {
81
ffio_fdopen
(&rtpctx->
pb
, handle);
82
}
else
83
ffio_open_dyn_packet_buf
(&rtpctx->
pb
, packet_size);
84
ret =
avformat_write_header
(rtpctx, &opts);
85
av_dict_free
(&opts);
86
87
if
(ret) {
88
if
(handle) {
89
avio_close
(rtpctx->
pb
);
90
}
else
{
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 Sat May 25 2013 04:01:19 for FFmpeg by
1.8.2