]> rtime.felk.cvut.cz Git - frescor/demo.git/blobdiff - src/recorder/ffmpeg.c
recorder: Decrease CPU budget
[frescor/demo.git] / src / recorder / ffmpeg.c
index 0336d7821375be0315d1ee079c1092c25f03d7e9..d5b0c7f2d9793be5fd38e4b852e6b39ae248fd1f 100644 (file)
@@ -180,6 +180,7 @@ static int64_t rec_timestamp = 0;
 static int64_t input_ts_offset = 0;
 static int file_overwrite = 0;
 static int o_direct = 0;
+static const char *contract_label = "recorder";
 static int metadata_count;
 static AVMetadataTag *metadata;
 static int do_benchmark = 0;
@@ -1262,9 +1263,10 @@ static int output_packet(AVInputStream *ist, int ist_index,
                     data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
                     /* XXX: allocate picture correctly */
                     avcodec_get_frame_defaults(&picture);
-
                     ret = avcodec_decode_video2(ist->st->codec,
                                                 &picture, &got_picture, &avpkt);
+                   if (picture.key_frame)
+                           printf("*");
                     ist->st->quality= picture.quality;
                     if (ret < 0)
                         goto fail_decode;
@@ -1589,6 +1591,7 @@ timespec_subtract (struct timespec *result,
 
 #ifdef CONFIG_FFMPEG_WITH_FRSH
 frsh_vres_id_t disk_vres;
+frsh_contract_t cpu_contract;
 frsh_contract_t disk_contract;
 #endif
 
@@ -1597,13 +1600,13 @@ print_timing(void)
 {
        static struct timespec start = {0,0};
        struct timespec end, d;
-       static int f = 0;       /* number of frames */
+       static int f = -1;      /* number interframe intevals elapsed */
        double ifi;
        static double ifi_avg=0, ifi_var=0;
 
        clock_gettime(CLOCK_MONOTONIC, &end);
        timespec_subtract(&d, &end, &start);
-       if (f++ == 0)
+       if (f++ < 0)
                goto out;       /* First run */
        ifi = (double)d.tv_sec + 1e-9*d.tv_nsec;
 #define SQ(x) ((x)*(x))        
@@ -1613,8 +1616,10 @@ print_timing(void)
               f, 1/ifi, 1/ifi_avg, 1/sqrt(ifi_var));
 
 #ifdef CONFIG_FFMPEG_WITH_FRSH
-       if (renegotiate == f)
+       if (renegotiate == f) {
+               frsh_contract_renegotiate_sync(&disk_contract, disk_vres);
                frsh_contract_renegotiate_sync(&disk_contract, disk_vres);
+       }
 #endif
 out:
        start = end;
@@ -2890,6 +2895,11 @@ static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
     return codec->id;
 }
 
+static void opt_contract_label(const char *label)
+{
+    contract_label = label;
+}
+
 static void opt_input_file(const char *filename)
 {
     AVFormatContext *ic;
@@ -3506,7 +3516,6 @@ static void opt_output_file(const char *filename)
         }
 
         /* open the file */
-       o_direct = 1;
         if (url_fopen(&oc->pb, filename, o_direct ? URL_RDWR|URL_DIRECT : URL_WRONLY) < 0) {
             fprintf(stderr, "Could not open '%s'\n", filename);
             av_exit(1);
@@ -3898,6 +3907,7 @@ static const OptionDef options[] = {
     { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
     { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
     { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
+    { "contract_label", HAS_ARG, {(void*)opt_contract_label}, "contract label", "label" },
     { "direct", OPT_BOOL, {(void*)&o_direct}, "write to output file using direct I/O (O_DIRECT)" },
     { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
     { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
@@ -4018,7 +4028,6 @@ static const OptionDef options[] = {
 };
 
 #ifdef CONFIG_FFMPEG_WITH_FRSH
-
 void *av_encode_thread(void *arg)
 {
     int ret, terror;
@@ -4039,17 +4048,14 @@ int frsh_stuff()
     frsh_thread_attr_t frsh_attr;
     frsh_thread_id_t thread;
     frsh_vres_id_t cpu_vres;
-    frsh_contract_t cpu_contract;
     frsh_rel_time_t cpu_budget, cpu_period;
 
     frsh_rel_time_t disk_budget, disk_period;
 
-    int ret, terror;
+    int ret;
 
-    PXW(frsh_init());
     cpu_budget = fosa_msec_to_rel_time(5);
-    cpu_period = fosa_msec_to_rel_time(1000/50);
+    cpu_period = fosa_msec_to_rel_time(1000/30);
 
 #if 1
 #define DISK_THROUGHPUT 20277LLU /* units??? probably MB/s */
@@ -4071,7 +4077,7 @@ int frsh_stuff()
                                         FRSH_CT_REGULAR);
     if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
     ret = frsh_contract_set_resource_and_label(&cpu_contract, 
-                                              FRSH_RT_PROCESSOR, FRSH_CPU_ID_DEFAULT, "recorder");
+                                              FRSH_RT_PROCESSOR, FRSH_CPU_ID_DEFAULT, contract_label);
     if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
 
     ret = frsh_contract_negotiate(&cpu_contract, &cpu_vres);
@@ -4089,7 +4095,8 @@ int frsh_stuff()
                                         FRSH_CT_REGULAR);
     if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
     ret = frsh_contract_set_resource_and_label(&disk_contract, 
-                                              FRSH_RT_DISK, 0, output_files[0]->filename);
+                                              FRSH_RT_DISK, 0, strstr(output_files[0]->filename, "://") == NULL ?
+                                              output_files[0]->filename : input_files[0]->filename);
     if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
 
     ret = frsh_contract_negotiate(&disk_contract, &disk_vres);
@@ -4144,6 +4151,14 @@ int main(int argc, char **argv)
 
     show_banner();
 
+#if CONFIG_FFMPEG_WITH_FRSH
+    {
+       int terror;
+       PXW(frsh_init());
+       printf("FRSH initialized\n");
+    }
+#endif
+
     /* parse options */
     parse_options(argc, argv, options, opt_output_file);