static void
gss_level_from_track (GssAdaptive * adaptive, GssIsomTrack * track,
    GssIsomMovie * movie, const char *filename, gboolean is_video)
{
  GssAdaptiveLevel *level;
  int i;

  g_return_if_fail (adaptive != NULL);
  g_return_if_fail (track != NULL);
  g_return_if_fail (movie != NULL);
  g_return_if_fail (filename != NULL);

  if (is_video) {
    adaptive->video_levels = g_realloc (adaptive->video_levels,
        (adaptive->n_video_levels + 1) * sizeof (GssAdaptiveLevel));
    level = adaptive->video_levels + adaptive->n_video_levels;
    adaptive->n_video_levels++;
  } else {
    adaptive->audio_levels = g_realloc (adaptive->audio_levels,
        (adaptive->n_audio_levels + 1) * sizeof (GssAdaptiveLevel));
    level = adaptive->audio_levels + adaptive->n_audio_levels;
    adaptive->n_audio_levels++;
  }
  memset (level, 0, sizeof (GssAdaptiveLevel));
  level->track = track;

  if (is_video) {
    adaptive->max_width = MAX (adaptive->max_width, track->mp4v.width);
    adaptive->max_height = MAX (adaptive->max_height, track->mp4v.height);
  }

  if (adaptive->drm_type != GSS_DRM_CLEAR) {
    generate_iv (level, filename, track->tkhd.track_id);

    for (i = 0; i < track->n_fragments; i++) {
      GssIsomFragment *fragment = track->fragments[i];
      gss_playready_setup_iv (adaptive->server->playready, adaptive, level,
          fragment);
      /* Hack to prevent serialization of sample encryption UUID and
       * enable saiz/saio serialization */
      if (adaptive->stream_type == GSS_ADAPTIVE_STREAM_ISOFF_ONDEMAND) {
        fragment->sample_encryption.present = FALSE;
        fragment->saiz.present = TRUE;
        fragment->saio.present = TRUE;
        fragment->tfdt.present = TRUE;
      }
    }
  }

  if (adaptive->drm_type == GSS_DRM_PLAYREADY) {
    /* FIXME move */
    if (adaptive->drm_info.data == NULL) {
      adaptive->drm_info.drm_type = GSS_DRM_PLAYREADY;
      adaptive->drm_info.data_len =
          gss_playready_get_protection_header (adaptive,
          adaptive->server->playready->license_url, NULL,
          &adaptive->drm_info.data);
    }
  }

  if (adaptive->stream_type == GSS_ADAPTIVE_STREAM_ISOFF_ONDEMAND) {
    gss_adaptive_convert_isoff_ondemand (adaptive, movie, track,
        adaptive->drm_type);
  } else if (adaptive->stream_type == GSS_ADAPTIVE_STREAM_ISM) {
    gss_adaptive_convert_ism (adaptive, movie, track, adaptive->drm_type);
  }

  level->track_id = track->tkhd.track_id;
  level->n_fragments = track->n_fragments;
  level->filename = g_strdup (filename);
  level->bitrate = estimate_bitrate (track);
  level->video_width = track->mp4v.width;
  level->video_height = track->mp4v.height;
  //level->file = file;

  level->codec_data = gss_hex_encode (track->esds.codec_data,
      track->esds.codec_data_len);
  if (is_video) {
    level->codec = g_strdup_printf ("avc1.%02x%02x%02x",
        track->esds.codec_data[1],
        track->esds.codec_data[2], track->esds.codec_data[3]);
    level->profile = track->esds.codec_data[1];
    level->level = track->esds.codec_data[2];
  } else {
    /* FIXME hard-coded AAC LC */
    level->codec = g_strdup ("mp4a.40.2");
    level->profile = 2;
    level->audio_rate = (track->mp4a.sample_rate >> 16);
  }
}
static void
load_file (GssAdaptive * adaptive, const char *filename)
{
  GssIsomParser *file;
  GssIsomTrack *video_track;
  GssIsomTrack *audio_track;

  g_return_if_fail (adaptive != 0);
  g_return_if_fail (filename != 0);

  file = gss_isom_parser_new ();
  adaptive->parsers[adaptive->n_parsers] = file;
  adaptive->n_parsers++;
  gss_isom_parser_parse_file (file, filename);

  if (file->movie->tracks[0]->n_fragments == 0) {
    gss_isom_parser_fragmentize (file,
        adaptive->stream_type == GSS_ADAPTIVE_STREAM_ISOFF_ONDEMAND ||
        adaptive->stream_type == GSS_ADAPTIVE_STREAM_ISOFF_LIVE);
  }
#if 0
  if (adaptive->drm_type == GSS_DRM_PLAYREADY &&
      adaptive->stream_type == GSS_ADAPTIVE_STREAM_ISOFF_ONDEMAND) {
    gss_playready_add_protection_header (file->movie, adaptive,
        adaptive->server->playready->license_url, NULL);
  }
#endif

  if (adaptive->duration == 0) {
    adaptive->duration = gss_isom_movie_get_duration (file->movie);
  }

  video_track = gss_isom_movie_get_video_track (file->movie);
  if (video_track) {
    gss_level_from_track (adaptive, video_track, file->movie, filename, TRUE);
  }

  audio_track = gss_isom_movie_get_audio_track (file->movie);
  if (audio_track) {
    gss_level_from_track (adaptive, audio_track, file->movie, filename, FALSE);
#if 0
    GssAdaptiveLevel *level;
    int i;

    adaptive->audio_levels = g_realloc (adaptive->audio_levels,
        (adaptive->n_audio_levels + 1) * sizeof (GssAdaptiveLevel));
    level = adaptive->audio_levels + adaptive->n_audio_levels;
    adaptive->n_audio_levels++;
    memset (level, 0, sizeof (GssAdaptiveLevel));

    generate_iv (level, filename, video_track->tkhd.track_id);

    for (i = 0; i < audio_track->n_fragments; i++) {
      GssIsomFragment *fragment = audio_track->fragments[i];
      gss_playready_setup_iv (adaptive->server->playready, adaptive, level,
          fragment);
    }
    gss_isom_track_prepare_streaming (file->movie, audio_track);

    level->track_id = audio_track->tkhd.track_id;
    level->track = audio_track;
    level->n_fragments =
        gss_isom_parser_get_n_fragments (file, level->track_id);
    level->file = file;
    level->filename = g_strdup (filename);
    level->bitrate = audio_bitrate;
    level->codec_data = gss_hex_encode (audio_track->esds.codec_data,
        audio_track->esds.codec_data_len);
    level->audio_rate = audio_track->mp4a.sample_rate >> 16;
    /* FIXME hard-coded AAC LC */
    level->codec = g_strdup ("mp4a.40.2");
#endif
  }

}
Пример #3
0
int main(int argc, char **argv) {

	int c;

	bzero(CONFIG_PATH, PATH_MAX);

	while ((c = getopt(argc,argv, "vf:")) != EOF) {
		switch (c) {
			case 'f':
				snprintf(CONFIG_PATH, PATH_MAX, "%s", optarg);
				break;
			case 'v':
				verbose = 1;
				break;
			case '?':
				fprintf(stderr,"Invalid argument\n");
				exit(1);
		}
	}

	read_config();
#ifdef HAVE_LIBMAGIC
	load_magic();
#endif
	load_regexes();

	pcre_callout = pcre_callout_spider;

	umask(077);

	compile_regexes();

	if (Encrypt) {
		// do we have a password?
		if (!strlen(Password)) {
			fprintf(stderr, "No password supplied\n");
			exit(1);
		}
		// prep the log array
		startlog = (struct logarray *)malloc(sizeof(struct logarray));
		if (startlog == NULL) {
			fprintf(stderr, "Malloc: %s\n", strerror(errno));
			exit(1);
		}
		bzero(startlog -> entry, LOG_MAX);
		currlog = startlog;
		// prep our keying material
		generate_iv();
		generate_key();
	}

	if (Log2File && !LogStdout) {
		// get our filehandle open
		if (AppendLog) {
			if (CustomLogPath[0]) {
				logfp = fopen(CustomLogPath, "a+");
			} else {
				logfp = fopen(LogPath, "a+");
			}
		} else {
			if (CustomLogPath[0]) {
				logfp = fopen(CustomLogPath, "w");
			} else {
				logfp = fopen(LogPath, "w");
			}
		}
		if (logfp == NULL) {
			fprintf(stderr, "unable to open %s:%s\n",
					LogPath,
					strerror(errno));
			exit(1);
		}
	}

	if (LogSyslog) {
		(void)openlog("spider", LOG_PID|LOG_NDELAY, LOG_FAC);
	}

	
	// normally, this would run as a child process
	// we'd hold the child PID in pid_t worker
	// when the Stop Spider button is clicked, 
	// we'll send a TERM signal to the child process
	//
	run_spider(START_PATH);

	if (LogFooter[0]) {
		write_footer();
	}

	if (Encrypt) {
		// write out the encrypted log
		if (!spider_encrypt()) {
			fprintf(stderr, "failure to write encrypted log!\n");
			exit(1);
		}
	}

	if (logfp) { fclose(logfp); }

	if (WhenDone == EXIT_WHEN_DONE) {
		if (verbose) {
			fprintf(stderr, "Normal exit.\n");
		}
		exit(0);
	}
	if (WhenDone == RESTORE_WHEN_DONE) {
		// GTK fru-fru
	}
	if (WhenDone == VIEWLOG_WHEN_DONE) {
		// launch the log viewer
	}

	exit(0);
}