]> git.sesse.net Git - ffmpeg/blobdiff - ffserver.c
parse and save hrd_fullness and range_map
[ffmpeg] / ffserver.c
index 20f2b2372461d8da1426a7f64490526527b2f174..f1777a9618364b536d4d7104915de68c94abbe01 100644 (file)
@@ -26,6 +26,7 @@
 #include <sys/poll.h>
 #include <errno.h>
 #include <sys/time.h>
+#undef time //needed because HAVE_AV_CONFIG_H is defined on top
 #include <time.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -599,7 +600,9 @@ static int http_server(void)
            second to handle timeouts */
         do {
             ret = poll(poll_table, poll_entry - poll_table, delay);
-        } while (ret == -1);
+            if (ret < 0 && errno != EAGAIN && errno != EINTR)
+                return -1;
+        } while (ret <= 0);
         
         cur_time = gettime_ms();
 
@@ -1351,7 +1354,7 @@ static int http_parse_request(HTTPContext *c)
                         q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "Content-type: video/x-ms-asf\r\n");
                         q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "\r\n");
                         q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "<ASX Version=\"3\">\r\n");
-                        q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "<!-- Autogenerated by ffserver -->\r\n");
+                        //q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "<!-- Autogenerated by ffserver -->\r\n");
                         q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "<ENTRY><REF HREF=\"http://%s/%s%s\"/></ENTRY>\r\n", 
                                 hostbuf, filename, info);
                         q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "</ASX>\r\n");
@@ -1754,7 +1757,7 @@ static void compute_stats(HTTPContext *c)
                 case CODEC_TYPE_VIDEO:
                     type = "video";
                     snprintf(parameters, sizeof(parameters), "%dx%d, q=%d-%d, fps=%d", st->codec.width, st->codec.height,
-                                st->codec.qmin, st->codec.qmax, st->codec.frame_rate / st->codec.frame_rate_base);
+                                st->codec.qmin, st->codec.qmax, st->codec.time_base.den / st->codec.time_base.num);
                     break;
                 default:
                     av_abort();
@@ -1937,9 +1940,9 @@ static int open_input_stream(HTTPContext *c, const char *info)
         }
     }
 
-#if 0
+#if 1
     if (c->fmt_in->iformat->read_seek) {
-        c->fmt_in->iformat->read_seek(c->fmt_in, stream_pos);
+        c->fmt_in->iformat->read_seek(c->fmt_in, 0, stream_pos, 0);
     }
 #endif
     /* set the start time (needed for maxtime and RTP packet timing) */
@@ -1995,15 +1998,18 @@ static int http_prepare_data(HTTPContext *c)
         c->fmt_ctx.nb_streams = c->stream->nb_streams;
         for(i=0;i<c->fmt_ctx.nb_streams;i++) {
             AVStream *st;
+           AVStream *src;
             st = av_mallocz(sizeof(AVStream));
             c->fmt_ctx.streams[i] = st;
             /* if file or feed, then just take streams from FFStream struct */
             if (!c->stream->feed || 
                 c->stream->feed == c->stream)
-                memcpy(st, c->stream->streams[i], sizeof(AVStream));
+                src = c->stream->streams[i];
             else
-                memcpy(st, c->stream->feed->streams[c->stream->feed_streams[i]],
-                           sizeof(AVStream));
+                src = c->stream->feed->streams[c->stream->feed_streams[i]];
+
+           *st = *src;
+           st->priv_data = 0;
             st->codec.frame_number = 0; /* XXX: should be done in
                                            AVStream, not in codec */
             /* I'm pretty sure that this is not correct...
@@ -2070,7 +2076,7 @@ static int http_prepare_data(HTTPContext *c)
                 } else {
                     /* update first pts if needed */
                     if (c->first_pts == AV_NOPTS_VALUE) {
-                        c->first_pts = pkt.dts;
+                        c->first_pts = av_rescale_q(pkt.dts, c->fmt_in->streams[pkt.stream_index]->time_base, AV_TIME_BASE_Q);
                         c->start_time = cur_time;
                     }
                     /* send it to the appropriate stream */
@@ -2119,10 +2125,10 @@ static int http_prepare_data(HTTPContext *c)
                             AVStream *st;
                             /* compute send time and duration */
                             st = c->fmt_in->streams[pkt.stream_index];
-                            c->cur_pts = pkt.dts;
+                            c->cur_pts = av_rescale_q(pkt.dts, st->time_base, AV_TIME_BASE_Q);
                             if (st->start_time != AV_NOPTS_VALUE)
-                                c->cur_pts -= st->start_time;
-                            c->cur_frame_duration = pkt.duration;
+                                c->cur_pts -= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
+                            c->cur_frame_duration = av_rescale_q(pkt.duration, st->time_base, AV_TIME_BASE_Q);
 #if 0
                             printf("index=%d pts=%0.3f duration=%0.6f\n",
                                    pkt.stream_index,
@@ -2162,7 +2168,7 @@ static int http_prepare_data(HTTPContext *c)
                             /* XXX: potential leak */
                             return -1;
                         }
-                        if (av_write_frame(ctx, pkt.stream_index, pkt.data, pkt.size)) {
+                        if (av_write_frame(ctx, &pkt)) {
                             c->state = HTTPSTATE_SEND_DATA_TRAILER;
                         }
                         
@@ -2711,7 +2717,7 @@ static void rtsp_cmd_describe(HTTPContext *c, const char *url)
     struct sockaddr_in my_addr;
     
     /* find which url is asked */
-    url_split(NULL, 0, NULL, 0, NULL, path1, sizeof(path1), url);
+    url_split(NULL, 0, NULL, 0, NULL, 0, NULL, path1, sizeof(path1), url);
     path = path1;
     if (*path == '/')
         path++;
@@ -2785,7 +2791,7 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url,
     RTSPActionServerSetup setup;
     
     /* find which url is asked */
-    url_split(NULL, 0, NULL, 0, NULL, path1, sizeof(path1), url);
+    url_split(NULL, 0, NULL, 0, NULL, 0, NULL, path1, sizeof(path1), url);
     path = path1;
     if (*path == '/')
         path++;
@@ -2940,7 +2946,7 @@ static HTTPContext *find_rtp_session_with_url(const char *url,
         return NULL;
 
     /* find which url is asked */
-    url_split(NULL, 0, NULL, 0, NULL, path1, sizeof(path1), url);
+    url_split(NULL, 0, NULL, 0, NULL, 0, NULL, path1, sizeof(path1), url);
     path = path1;
     if (*path == '/')
         path++;
@@ -3219,6 +3225,7 @@ static AVStream *add_av_stream1(FFStream *stream, AVCodecContext *codec)
     memcpy(&fst->codec, codec, sizeof(AVCodecContext));
     fst->codec.coded_frame = &dummy_frame;
     fst->index = stream->nb_streams;
+    av_set_pts_info(fst, 33, 1, 90000);
     stream->streams[stream->nb_streams++] = fst;
     return fst;
 }
@@ -3247,8 +3254,8 @@ static int add_av_stream(FFStream *feed, AVStream *st)
             case CODEC_TYPE_VIDEO:
                 if (av1->width == av->width &&
                     av1->height == av->height &&
-                    av1->frame_rate == av->frame_rate &&
-                    av1->frame_rate_base == av->frame_rate_base &&
+                    av1->time_base.den == av->time_base.den &&
+                    av1->time_base.num == av->time_base.num &&
                     av1->gop_size == av->gop_size)
                     goto found;
                 break;
@@ -3445,8 +3452,8 @@ static void build_feed_streams(void)
                                 printf("Codec bitrates do not match for stream %d\n", i);
                                 matches = 0;
                             } else if (ccf->codec_type == CODEC_TYPE_VIDEO) {
-                                if (CHECK_CODEC(frame_rate) ||
-                                    CHECK_CODEC(frame_rate_base) ||
+                                if (CHECK_CODEC(time_base.den) ||
+                                    CHECK_CODEC(time_base.num) ||
                                     CHECK_CODEC(width) ||
                                     CHECK_CODEC(height)) {
                                     printf("Codec width, height and framerate do not match for stream %d\n", i);
@@ -3606,9 +3613,9 @@ static void add_codec(FFStream *stream, AVCodecContext *av)
     case CODEC_TYPE_VIDEO:
         if (av->bit_rate == 0)
             av->bit_rate = 64000;
-        if (av->frame_rate == 0){
-            av->frame_rate = 5;
-            av->frame_rate_base = 1;
+        if (av->time_base.num == 0){
+            av->time_base.den = 5;
+            av->time_base.num = 1;
         }
         if (av->width == 0 || av->height == 0) {
             av->width = 160;
@@ -3626,6 +3633,13 @@ static void add_codec(FFStream *stream, AVCodecContext *av)
         av->qcompress = 0.5;
         av->qblur = 0.5;
 
+        if (!av->nsse_weight) 
+            av->nsse_weight = 8;
+
+        av->frame_skip_cmp = FF_CMP_DCTMAX;
+        av->me_method = ME_EPZS;
+        av->rc_buffer_aggressivity = 1.0;
+
         if (!av->rc_eq)
             av->rc_eq = "tex^qComp";
         if (!av->i_quant_factor)
@@ -3634,11 +3648,14 @@ static void add_codec(FFStream *stream, AVCodecContext *av)
             av->b_quant_factor = 1.25;
         if (!av->b_quant_offset)
             av->b_quant_offset = 1.25;
-        if (!av->rc_min_rate)
-            av->rc_min_rate = av->bit_rate / 2;
         if (!av->rc_max_rate)
             av->rc_max_rate = av->bit_rate * 2;
 
+        if (av->rc_max_rate && !av->rc_buffer_size) {
+            av->rc_buffer_size = av->rc_max_rate;
+        }
+
+
         break;
     default:
         av_abort();
@@ -4061,10 +4078,20 @@ static int parse_ffconfig(const char *filename)
                     errors++;
                 }
             }
+        } else if (!strcasecmp(cmd, "Debug")) {
+            if (stream) {
+                get_arg(arg, sizeof(arg), &p);
+                video_enc.debug = strtol(arg,0,0);
+            }
+        } else if (!strcasecmp(cmd, "Strict")) {
+            if (stream) {
+                get_arg(arg, sizeof(arg), &p);
+                video_enc.strict_std_compliance = atoi(arg);
+            }
         } else if (!strcasecmp(cmd, "VideoBufferSize")) {
             if (stream) {
                 get_arg(arg, sizeof(arg), &p);
-                video_enc.rc_buffer_size = atoi(arg) * 1024;
+                video_enc.rc_buffer_size = atoi(arg) * 8*1024;
             }
         } else if (!strcasecmp(cmd, "VideoBitRateTolerance")) {
             if (stream) {
@@ -4090,8 +4117,8 @@ static int parse_ffconfig(const char *filename)
         } else if (!strcasecmp(cmd, "VideoFrameRate")) {
             get_arg(arg, sizeof(arg), &p);
             if (stream) {
-                video_enc.frame_rate_base= DEFAULT_FRAME_RATE_BASE;
-                video_enc.frame_rate = (int)(strtod(arg, NULL) * video_enc.frame_rate_base);
+                video_enc.time_base.num= DEFAULT_FRAME_RATE_BASE;
+                video_enc.time_base.den = (int)(strtod(arg, NULL) * video_enc.time_base.num);
             }
         } else if (!strcasecmp(cmd, "VideoGopSize")) {
             get_arg(arg, sizeof(arg), &p);