[FFmpeg-cvslog] rtpdec_hevc: Share the implementation of parsing a=framesize with h264

Martin Storsjö git at videolan.org
Tue Feb 24 23:10:01 CET 2015


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Mon Feb 23 20:59:41 2015 +0200| [8633fb47db2ec39eb8bd1bd65302af75a94ff5d0] | committer: Martin Storsjö

rtpdec_hevc: Share the implementation of parsing a=framesize with h264

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8633fb47db2ec39eb8bd1bd65302af75a94ff5d0
---

 libavformat/rtpdec_formats.h |    1 +
 libavformat/rtpdec_h264.c    |   43 ++++++++++++++++++++++--------------------
 libavformat/rtpdec_hevc.c    |   28 +--------------------------
 3 files changed, 25 insertions(+), 47 deletions(-)

diff --git a/libavformat/rtpdec_formats.h b/libavformat/rtpdec_formats.h
index 1cc3bab..4dcc198 100644
--- a/libavformat/rtpdec_formats.h
+++ b/libavformat/rtpdec_formats.h
@@ -42,6 +42,7 @@ int ff_h264_handle_aggregated_packet(AVFormatContext *ctx, AVPacket *pkt,
                                      const uint8_t *buf, int len,
                                      int start_skip, int *nal_counters,
                                      int nal_mask);
+void ff_h264_parse_framesize(AVCodecContext *codec, const char *p);
 
 extern RTPDynamicProtocolHandler ff_ac3_dynamic_handler;
 extern RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler;
diff --git a/libavformat/rtpdec_h264.c b/libavformat/rtpdec_h264.c
index 8a38392..ba166b8 100644
--- a/libavformat/rtpdec_h264.c
+++ b/libavformat/rtpdec_h264.c
@@ -177,6 +177,28 @@ static int sdp_parse_fmtp_config_h264(AVFormatContext *s,
     return 0;
 }
 
+void ff_h264_parse_framesize(AVCodecContext *codec, const char *p)
+{
+    char buf1[50];
+    char *dst = buf1;
+
+    // remove the protocol identifier
+    while (*p && *p == ' ')
+        p++;                     // strip spaces.
+    while (*p && *p != ' ')
+        p++;                     // eat protocol identifier
+    while (*p && *p == ' ')
+        p++;                     // strip trailing spaces.
+    while (*p && *p != '-' && (dst - buf1) < sizeof(buf1) - 1)
+        *dst++ = *p++;
+    *dst = '\0';
+
+    // a='framesize:96 320-240'
+    // set our parameters
+    codec->width   = atoi(buf1);
+    codec->height  = atoi(p + 1); // skip the -
+}
+
 int ff_h264_handle_aggregated_packet(AVFormatContext *ctx, AVPacket *pkt,
                                      const uint8_t *buf, int len,
                                      int skip_between, int *nal_counters,
@@ -361,34 +383,15 @@ static int parse_h264_sdp_line(AVFormatContext *s, int st_index,
                                PayloadContext *h264_data, const char *line)
 {
     AVStream *stream;
-    AVCodecContext *codec;
     const char *p = line;
 
     if (st_index < 0)
         return 0;
 
     stream = s->streams[st_index];
-    codec  = stream->codec;
 
     if (av_strstart(p, "framesize:", &p)) {
-        char buf1[50];
-        char *dst = buf1;
-
-        // remove the protocol identifier
-        while (*p && *p == ' ')
-            p++;                     // strip spaces.
-        while (*p && *p != ' ')
-            p++;                     // eat protocol identifier
-        while (*p && *p == ' ')
-            p++;                     // strip trailing spaces.
-        while (*p && *p != '-' && (dst - buf1) < sizeof(buf1) - 1)
-            *dst++ = *p++;
-        *dst = '\0';
-
-        // a='framesize:96 320-240'
-        // set our parameters
-        codec->width   = atoi(buf1);
-        codec->height  = atoi(p + 1); // skip the -
+        ff_h264_parse_framesize(stream->codec, p);
     } else if (av_strstart(p, "fmtp:", &p)) {
         return ff_parse_fmtp(s, stream, h264_data, p, sdp_parse_fmtp_config_h264);
     } else if (av_strstart(p, "cliprect:", &p)) {
diff --git a/libavformat/rtpdec_hevc.c b/libavformat/rtpdec_hevc.c
index ed8e8aa..224ccec 100644
--- a/libavformat/rtpdec_hevc.c
+++ b/libavformat/rtpdec_hevc.c
@@ -138,33 +138,7 @@ static av_cold int hevc_parse_sdp_line(AVFormatContext *ctx, int st_index,
     codec  = current_stream->codec;
 
     if (av_strstart(sdp_line_ptr, "framesize:", &sdp_line_ptr)) {
-        char str_video_width[50];
-        char *str_video_width_ptr = str_video_width;
-
-        /*
-         * parse "a=framesize:96 320-240"
-         */
-
-        /* ignore spaces */
-        while (*sdp_line_ptr && *sdp_line_ptr == ' ')
-            sdp_line_ptr++;
-        /* ignore RTP payload ID */
-        while (*sdp_line_ptr && *sdp_line_ptr != ' ')
-            sdp_line_ptr++;
-        /* ignore spaces */
-        while (*sdp_line_ptr && *sdp_line_ptr == ' ')
-            sdp_line_ptr++;
-        /* extract the actual video resolution description */
-        while (*sdp_line_ptr && *sdp_line_ptr != '-' &&
-               (str_video_width_ptr - str_video_width) < sizeof(str_video_width) - 1)
-            *str_video_width_ptr++ = *sdp_line_ptr++;
-        /* add trailing zero byte */
-        *str_video_width_ptr = '\0';
-
-        /* determine the width value */
-        codec->width   = atoi(str_video_width);
-        /* jump beyond the "-" and determine the height value */
-        codec->height  = atoi(sdp_line_ptr + 1);
+        ff_h264_parse_framesize(codec, sdp_line_ptr);
     } else if (av_strstart(sdp_line_ptr, "fmtp:", &sdp_line_ptr)) {
         int ret = ff_parse_fmtp(ctx, current_stream, hevc_data, sdp_line_ptr,
                                 hevc_sdp_parse_fmtp_config);



More information about the ffmpeg-cvslog mailing list