ffmpeg / libavformat / rtpenc_mpv.c @ 2912e87a
History | View | Annotate | Download (3.62 KB)
1 | 98561024 | Luca Abeni | /*
|
---|---|---|---|
2 | * RTP packetization for MPEG video
|
||
3 | 406792e7 | Diego Biurrun | * Copyright (c) 2002 Fabrice Bellard
|
4 | * Copyright (c) 2007 Luca Abeni
|
||
5 | 98561024 | Luca Abeni | *
|
6 | 2912e87a | Mans Rullgard | * This file is part of Libav.
|
7 | 98561024 | Luca Abeni | *
|
8 | 2912e87a | Mans Rullgard | * Libav is free software; you can redistribute it and/or
|
9 | 98561024 | Luca Abeni | * modify it under the terms of the GNU Lesser General Public
|
10 | * License as published by the Free Software Foundation; either
|
||
11 | * version 2.1 of the License, or (at your option) any later version.
|
||
12 | *
|
||
13 | 2912e87a | Mans Rullgard | * Libav is distributed in the hope that it will be useful,
|
14 | 98561024 | Luca Abeni | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
16 | * Lesser General Public License for more details.
|
||
17 | *
|
||
18 | * You should have received a copy of the GNU Lesser General Public
|
||
19 | 2912e87a | Mans Rullgard | * License along with Libav; if not, write to the Free Software
|
20 | 98561024 | Luca Abeni | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
21 | */
|
||
22 | 245976da | Diego Biurrun | |
23 | #include "libavcodec/mpegvideo.h" |
||
24 | 98561024 | Luca Abeni | #include "avformat.h" |
25 | 302879cb | Luca Abeni | #include "rtpenc.h" |
26 | 98561024 | Luca Abeni | |
27 | /* NOTE: a single frame must be passed with sequence header if
|
||
28 | needed. XXX: use slices. */
|
||
29 | void ff_rtp_send_mpegvideo(AVFormatContext *s1, const uint8_t *buf1, int size) |
||
30 | { |
||
31 | 302879cb | Luca Abeni | RTPMuxContext *s = s1->priv_data; |
32 | 98561024 | Luca Abeni | int len, h, max_packet_size;
|
33 | uint8_t *q; |
||
34 | 4db819bc | Luca Barbato | const uint8_t *end = buf1 + size;
|
35 | 2d7d6d42 | Luca Abeni | int begin_of_slice, end_of_slice, frame_type, temporal_reference;
|
36 | 98561024 | Luca Abeni | |
37 | max_packet_size = s->max_payload_size; |
||
38 | 46b274d4 | Luca Abeni | begin_of_slice = 1;
|
39 | end_of_slice = 0;
|
||
40 | 73130dfe | Luca Abeni | frame_type = 0;
|
41 | 2d7d6d42 | Luca Abeni | temporal_reference = 0;
|
42 | 98561024 | Luca Abeni | |
43 | while (size > 0) { |
||
44 | 3f19004e | Luca Abeni | int begin_of_sequence;
|
45 | |||
46 | begin_of_sequence = 0;
|
||
47 | f6df400c | Luca Barbato | len = max_packet_size - 4;
|
48 | |||
49 | if (len >= size) {
|
||
50 | len = size; |
||
51 | 46b274d4 | Luca Abeni | end_of_slice = 1;
|
52 | } else {
|
||
53 | const uint8_t *r, *r1;
|
||
54 | int start_code;
|
||
55 | |||
56 | r1 = buf1; |
||
57 | while (1) { |
||
58 | start_code = -1;
|
||
59 | 4db819bc | Luca Barbato | r = ff_find_start_code(r1, end, &start_code); |
60 | 46b274d4 | Luca Abeni | if((start_code & 0xFFFFFF00) == 0x100) { |
61 | /* New start code found */
|
||
62 | 73130dfe | Luca Abeni | if (start_code == 0x100) { |
63 | frame_type = (r[1] & 0x38) >> 3; |
||
64 | 2d7d6d42 | Luca Abeni | temporal_reference = (int)r[0] << 2 | r[1] >> 6; |
65 | 73130dfe | Luca Abeni | } |
66 | 3f19004e | Luca Abeni | if (start_code == 0x1B8) { |
67 | begin_of_sequence = 1;
|
||
68 | } |
||
69 | 73130dfe | Luca Abeni | |
70 | 80150f7e | Luca Abeni | if (r - buf1 - 4 <= len) { |
71 | 46b274d4 | Luca Abeni | /* The current slice fits in the packet */
|
72 | if (begin_of_slice == 0) { |
||
73 | /* no slice at the beginning of the packet... */
|
||
74 | end_of_slice = 1;
|
||
75 | len = r - buf1 - 4;
|
||
76 | break;
|
||
77 | } |
||
78 | r1 = r; |
||
79 | } else {
|
||
80 | 80150f7e | Luca Abeni | if ((r1 - buf1 > 4) && (r - r1 < max_packet_size)) { |
81 | 46b274d4 | Luca Abeni | len = r1 - buf1 - 4;
|
82 | end_of_slice = 1;
|
||
83 | } |
||
84 | break;
|
||
85 | } |
||
86 | } else {
|
||
87 | break;
|
||
88 | } |
||
89 | } |
||
90 | f6df400c | Luca Barbato | } |
91 | |||
92 | 98561024 | Luca Abeni | h = 0;
|
93 | 2d7d6d42 | Luca Abeni | h |= temporal_reference << 16;
|
94 | 3f19004e | Luca Abeni | h |= begin_of_sequence << 13;
|
95 | 46b274d4 | Luca Abeni | h |= begin_of_slice << 12;
|
96 | h |= end_of_slice << 11;
|
||
97 | 73130dfe | Luca Abeni | h |= frame_type << 8;
|
98 | f6df400c | Luca Barbato | |
99 | 98561024 | Luca Abeni | q = s->buf; |
100 | *q++ = h >> 24;
|
||
101 | *q++ = h >> 16;
|
||
102 | *q++ = h >> 8;
|
||
103 | *q++ = h; |
||
104 | |||
105 | memcpy(q, buf1, len); |
||
106 | q += len; |
||
107 | |||
108 | 910f02a0 | Diego Biurrun | /* 90kHz time stamp */
|
109 | af74c95a | Luca Abeni | s->timestamp = s->cur_timestamp; |
110 | 98561024 | Luca Abeni | ff_rtp_send_data(s1, s->buf, q - s->buf, (len == size)); |
111 | |||
112 | buf1 += len; |
||
113 | size -= len; |
||
114 | 46b274d4 | Luca Abeni | begin_of_slice = end_of_slice; |
115 | end_of_slice = 0;
|
||
116 | 98561024 | Luca Abeni | } |
117 | } |
||
118 |