FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavformat/rtpenc_chain.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 30 51 58.8%
Functions: 1 1 100.0%
Branches: 8 26 30.8%

Line Branch Exec Source
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 "rtp.h"
26 #include "url.h"
27 #include "libavutil/opt.h"
28
29 2 int ff_rtp_chain_mux_open(AVFormatContext **out, AVFormatContext *s,
30 AVStream *st, URLContext *handle, int packet_size,
31 int idx)
32 {
33 2 AVFormatContext *rtpctx = NULL;
34 int ret;
35 2 const AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL);
36 uint8_t *rtpflags;
37 2 AVDictionary *opts = NULL;
38
39
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!rtp_format) {
40 ret = AVERROR(ENOSYS);
41 goto fail;
42 }
43
44 /* Allocate an AVFormatContext for each output stream */
45 2 rtpctx = avformat_alloc_context();
46
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!rtpctx) {
47 ret = AVERROR(ENOMEM);
48 goto fail;
49 }
50
51 2 rtpctx->oformat = rtp_format;
52
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
2 if (!avformat_new_stream(rtpctx, NULL)) {
53 ret = AVERROR(ENOMEM);
54 goto fail;
55 }
56 /* Pass the interrupt callback on */
57 2 rtpctx->interrupt_callback = s->interrupt_callback;
58 /* Copy the max delay setting; the rtp muxer reads this. */
59 2 rtpctx->max_delay = s->max_delay;
60 /* Copy other stream parameters. */
61 2 rtpctx->streams[0]->sample_aspect_ratio = st->sample_aspect_ratio;
62 2 rtpctx->flags |= s->flags & AVFMT_FLAG_BITEXACT;
63 2 rtpctx->strict_std_compliance = s->strict_std_compliance;
64
65 /* Get the payload type from the codec */
66
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (st->id < RTP_PT_PRIVATE)
67 2 rtpctx->streams[0]->id =
68 2 ff_rtp_get_payload_type(s, st->codecpar, idx);
69 else
70 rtpctx->streams[0]->id = st->id;
71
72
73
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 if (av_opt_get(s, "rtpflags", AV_OPT_SEARCH_CHILDREN, &rtpflags) >= 0)
74 2 av_dict_set(&opts, "rtpflags", rtpflags, AV_DICT_DONT_STRDUP_VAL);
75
76 /* Set the synchronized start time. */
77 2 rtpctx->start_time_realtime = s->start_time_realtime;
78
79 2 avcodec_parameters_copy(rtpctx->streams[0]->codecpar, st->codecpar);
80 2 rtpctx->streams[0]->time_base = st->time_base;
81
82
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (handle) {
83 ret = ffio_fdopen(&rtpctx->pb, handle);
84 if (ret < 0)
85 ffurl_close(handle);
86 } else
87 2 ret = ffio_open_dyn_packet_buf(&rtpctx->pb, packet_size);
88
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (!ret)
89 2 ret = avformat_write_header(rtpctx, &opts);
90 2 av_dict_free(&opts);
91
92
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (ret) {
93 if (handle && rtpctx->pb) {
94 avio_closep(&rtpctx->pb);
95 } else if (rtpctx->pb) {
96 ffio_free_dyn_buf(&rtpctx->pb);
97 }
98 avformat_free_context(rtpctx);
99 return ret;
100 }
101
102 2 *out = rtpctx;
103 2 return 0;
104
105 fail:
106 avformat_free_context(rtpctx);
107 if (handle)
108 ffurl_close(handle);
109 return ret;
110 }
111