Пример #1
0
    def action_open(self, file_location):
        """Triggers open file diaglog, reading a new file's metadata."""
        tmp_in_file = file_location
        if not tmp_in_file:
            return
        self.in_file = tmp_in_file

        print("Current 360 video: %s" % ntpath.basename(self.in_file))

        console = Console()
        parsed_metadata = metadata_utils.parse_metadata(
            self.in_file, console.append)

        metadata = None
        audio_metadata = None
        if parsed_metadata:
            metadata = parsed_metadata.video
            audio_metadata = parsed_metadata.audio

        for line in console.log:
            if "Error" in line:
                print("Failed to load file %s" % ntpath.basename(self.in_file))
                self.var_spherical = False
                self.var_spatial_audio = False
                return

        if audio_metadata:
            print(audio_metadata.get_metadata_string())
Пример #2
0
    def action_open(self):
        """Triggers open file diaglog, reading a new file's metadata."""
        tmp_in_file = tkFileDialog.askopenfilename(**self.open_options)
        if not tmp_in_file:
            return
        self.in_file = tmp_in_file

        self.set_message("Opened file: %s\n" % ntpath.basename(self.in_file))

        console = Console()
        parsed_metadata = metadata_utils.parse_metadata(self.in_file,
                                                        console.append)

        metadata = None
        audio_metadata = None
        if parsed_metadata:
            metadata = parsed_metadata.video
            audio_metadata = parsed_metadata.audio

        for line in console.log:
            if "Error" in line:
                self.set_error("Failed to load file %s"
                               % ntpath.basename(self.in_file))
                self.var_spherical.set(0)
                self.var_spatial_audio.set(0)
                self.disable_state()
                self.button_open.configure(state="normal")
                self.button_quit.configure(state="normal")
                return

        self.enable_state()
        self.checkbox_spherical.configure(state="normal")

        infile = os.path.abspath(self.in_file)
        file_extension = os.path.splitext(infile)[1].lower()
        self.enable_spatial_audio =\
            True if (file_extension == ".mp4") else False

        if not metadata:
            self.var_spherical.set(0)
            self.var_3d.set(0)

        if not audio_metadata:
            self.var_spatial_audio.set(0)

        if metadata:
            metadata = metadata.itervalues().next()
            self.var_spherical.set(1)

            if metadata.get("Spherical", "") == "true":
                self.var_spherical.set(1)
            else:
                self.var_spherical.set(0)

            if metadata.get("StereoMode", "") == "top-bottom":
                self.var_3d.set(1)
            else:
                self.var_3d.set(0)

        if audio_metadata:
            self.var_spatial_audio.set(1)
            self.options_ambisonics["text"] =\
                audio_metadata.get_metadata_string()


        self.update_state()
Пример #3
0
def main():
    """Main function for printing and injecting spatial media metadata."""

    parser = argparse.ArgumentParser(
        usage=
        "%(prog)s [options] [files...]\n\nBy default prints out spatial media "
        "metadata from specified files.")
    parser.add_argument(
        "-i",
        "--inject",
        action="store_true",
        help=
        "injects spatial media metadata into the first file specified (.mp4 or "
        ".mov) and saves the result to the second file specified")
    parser.add_argument(
        "-b",
        "--show-atoms",
        action="store_true",
        help=
        "Displays the atom layout for the movie. Note the MOV/MP4 format is not self-parsable"
        "e.g. there is no way to know the containts of a container atom without documentation."
    )

    video_group = parser.add_argument_group("Spherical Video")
    video_group.add_argument(
        "-s",
        "--stereo",
        action="store",
        dest="stereo_mode",
        metavar="STEREO-MODE",
        choices=["none", "top-bottom", "left-right", "custom"],
        default=None,
        help="stereo mode (none | top-bottom | left-right | custom)")
    video_group.add_argument(
        "-m",
        "--projection",
        action="store",
        dest="projection",
        metavar="SPHERICAL-MODE",
        choices=[
            "equirectangular", "cubemap", "mesh", "full-frame", "equi-mesh"
        ],
        default=None,
        help=
        "projection (equirectangular | cubemap | mesh | full-frame | equi-mesh)"
    )
    video_group.add_argument("-y",
                             "--yaw",
                             action="store",
                             dest="yaw",
                             metavar="YAW",
                             default=0,
                             help="yaw")
    video_group.add_argument("-p",
                             "--pitch",
                             action="store",
                             dest="pitch",
                             metavar="PITCH",
                             default=0,
                             help="pitch")
    video_group.add_argument("-r",
                             "--roll",
                             action="store",
                             dest="roll",
                             metavar="ROLL",
                             default=0,
                             help="roll")
    video_group.add_argument("-d",
                             "--degrees",
                             action="store",
                             dest="degrees",
                             metavar="DEGREES",
                             choices=["180", "360"],
                             default=180,
                             help="degrees")
    video_group.add_argument(
        "-c",
        "--correction",
        action="store",
        dest="fisheye_correction",
        metavar="FISHEYE-CORRECTION",
        default="0:0:0:0",
        help=
        "polynomial fisheye lens correction (n1:n2:n3:n4) e.g 0.5:-0.1:0.2:-0.0005"
    )
    video_group.add_argument(
        "-v",
        "--view",
        action="store",
        dest="field_of_view",
        metavar="FIELD-OF-VIEW",
        default="0x0",
        help="Field of view for equi_mesh or full frame. e.g. 180x180 or 16x9")
    video_group.add_argument(
        "-1",
        "--force_v1_360_equi_metadata",
        action="store_true",
        help="Add v1 metadata as well as v2 metadata to the video."
        "This is only really valid for 360 equirectangular videos, but some video players only enable VR if they recognise v1 metadata"
    )

    audio_group = parser.add_argument_group("Spatial Audio")
    audio_group.add_argument(
        "-a",
        "--spatial-audio",
        action="store_true",
        help="spatial audio. First-order periphonic ambisonics with ACN channel "
        "ordering and SN3D normalization")
    parser.add_argument("file", nargs="+", help="input/output files")

    args = parser.parse_args()

    if args.inject:
        if len(args.file) != 2:
            console(
                "Injecting metadata requires both an input file and output file."
            )
            return

        metadata = metadata_utils.Metadata()

        if args.stereo_mode:
            metadata.stereo = args.stereo_mode

        if args.projection:
            metadata.spherical = args.projection
            if metadata.spherical == "equirectangular":
                metadata.clip_left_right = 0 if args.degrees == "360" else 1073741823

        if args.spatial_audio:
            parsed_metadata = metadata_utils.parse_metadata(
                args.file[0], console)
            if not metadata.audio:
                spatial_audio_description = metadata_utils.get_spatial_audio_description(
                    parsed_metadata.num_audio_channels)
                if spatial_audio_description.is_supported:
                    metadata.audio = metadata_utils.get_spatial_audio_metadata(
                        spatial_audio_description.order,
                        spatial_audio_description.has_head_locked_stereo)
                else:
                    console("Audio has %d channel(s) and is not a supported "
                            "spatial audio format." %
                            (parsed_metadata.num_audio_channels))
                    return

        if args.fisheye_correction:
            metadata.fisheye_correction = [
                float(x) for x in args.fisheye_correction.split(':')
            ]

        if args.field_of_view:
            metadata.fov = [float(x) for x in args.field_of_view.split('x')]
            if metadata.fov[0] == 0 or metadata.fov[1] == 0:
                if args.projection == "full-frame":
                    metadata.fov[0] = 16.0
                    metadata.fov[1] = 9.0
                else:
                    metadata.fov[0] = 180
                    metadata.fov[1] = 180

        if args.force_v1_360_equi_metadata:
            console("generating metadata.")
            metadata.v1_xml = metadata_utils.generate_spherical_xml(
                args.stereo_mode)
            console(metadata.v1_xml)

        if metadata.stereo or metadata.spherical or metadata.audio:
            metadata.orientation = {
                "yaw": args.yaw,
                "pitch": args.pitch,
                "roll": args.roll
            }
            metadata_utils.inject_metadata(args.file[0], args.file[1],
                                           metadata, console,
                                           args.force_v1_360_equi_metadata)
        else:
            console("Failed to generate metadata.")
        return

    if len(args.file) > 0:
        for input_file in args.file:
            if args.spatial_audio:
                parsed_metadata = metadata_utils.parse_metadata(
                    input_file, console)
                metadata.audio = metadata_utils.get_spatial_audio_description(
                    parsed_metadata.num_channels)
            metadata_utils.parse_metadata(input_file, console)
            metadata_utils.show_atoms(input_file, console)

        return

    parser.print_help()
    return
Пример #4
0
def main():
    """Main function for printing and injecting spatial media metadata."""

    parser = argparse.ArgumentParser(
        usage=
        "%(prog)s [options] [files...]\n\nBy default prints out spatial media "
        "metadata from specified files.")
    parser.add_argument(
        "-i",
        "--inject",
        action="store_true",
        help=
        "injects spatial media metadata into the first file specified (.mp4 or "
        ".mov) and saves the result to the second file specified")

    video_group = parser.add_argument_group("Spherical Video")
    video_group.add_argument(
        "-s",
        "--stereo",
        action="store",
        dest="stereo_mode",
        metavar="STEREO-MODE",
        choices=["none", "top-bottom", "left-right"],
        default=None,
        help="stereo mode (none | top-bottom | left-right)")
    video_group.add_argument("-m",
                             "--projection",
                             action="store",
                             dest="projection",
                             metavar="SPHERICAL-MODE",
                             choices=["equirectangular", "cubemap"],
                             default=None,
                             help="projection (equirectangular | cubemap)")
    video_group.add_argument("-y",
                             "--yaw",
                             action="store",
                             dest="yaw",
                             metavar="YAW",
                             default=0,
                             help="yaw")
    video_group.add_argument("-p",
                             "--pitch",
                             action="store",
                             dest="pitch",
                             metavar="PITCH",
                             default=0,
                             help="pitch")
    video_group.add_argument("-r",
                             "--roll",
                             action="store",
                             dest="roll",
                             metavar="ROLL",
                             default=0,
                             help="roll")
    video_group.add_argument("-d",
                             "--degrees",
                             action="store",
                             dest="degrees",
                             metavar="DEGREES",
                             choices=["180", "360"],
                             default=180,
                             help="degrees")

    audio_group = parser.add_argument_group("Spatial Audio")
    audio_group.add_argument(
        "-a",
        "--spatial-audio",
        action="store_true",
        help="spatial audio. First-order periphonic ambisonics with ACN channel "
        "ordering and SN3D normalization")
    parser.add_argument("file", nargs="+", help="input/output files")

    args = parser.parse_args()

    if args.inject:
        if len(args.file) != 2:
            console(
                "Injecting metadata requires both an input file and output file."
            )
            return

        metadata = metadata_utils.Metadata()

        if args.stereo_mode:
            metadata.stereo = args.stereo_mode

        if args.projection:
            metadata.spherical = args.projection
            if metadata.spherical == "equirectangular":
                metadata.clip_left_right = 0 if args.degrees == "360" else 1073741823

        if args.spatial_audio:
            metadata.audio = metadata_utils.SPATIAL_AUDIO_DEFAULT_METADATA

        if metadata.stereo or metadata.spherical or metadata.audio:
            metadata.orientation = {
                "yaw": args.yaw,
                "pitch": args.pitch,
                "roll": args.roll
            }
            metadata_utils.inject_metadata(args.file[0], args.file[1],
                                           metadata, console)
        else:
            console("Failed to generate metadata.")
        return

    if len(args.file) > 0:
        for input_file in args.file:
            metadata_utils.parse_metadata(input_file, console)
        return

    parser.print_help()
    return
Пример #5
0
    def action_open(self):
        """Triggers open file diaglog, reading a new file's metadata."""
        tmp_in_file = tkFileDialog.askopenfilename(**self.open_options)
        if not tmp_in_file:
            return
        self.in_file = tmp_in_file

        self.set_message("Current 360 video: %s" % ntpath.basename(self.in_file))

        console = Console()
        parsed_metadata = metadata_utils.parse_metadata(self.in_file,
                                                        console.append)

        metadata = None
        audio_metadata = None
        if parsed_metadata:
            metadata = parsed_metadata.video
            audio_metadata = parsed_metadata.audio
            stereo = parsed_metadata.stereo

        for line in console.log:
            if "Error" in line:
                self.set_error("Failed to load file %s"
                               % ntpath.basename(self.in_file))
                self.disable_state()
                self.button_open.configure(state="normal")
                return

        self.enable_state()
        #        self.checkbox_spherical.configure(state="normal")

        infile = os.path.abspath(self.in_file)
        file_extension = os.path.splitext(infile)[1].lower()

        #   self.var_spherical.set(1)
        self.enable_spatial_audio = parsed_metadata.num_audio_channels == 4

        if not metadata:
            #    self.var_3d.set(0)
            self.char_degrees.set("180")
            self.char_layout.set("left-right")

        if not audio_metadata:
            self.var_spatial_audio.set(0)

        if metadata:
            # metadata here is an dict with a sv3d box
            metadata = metadata.values()[0]
            if metadata.clip_left_right > 0 or metadata.projection == "mesh":
                self.char_degrees.set("180")
            else:
                self.char_degrees.set("360")

            if metadata.projection == "mesh":
                self.char_format.set("fisheye")
            elif metadata.projection == "equirectangular":
                self.char_format.set("equi-rectangular")
            else:
                self.char_format.set(metadata.projection)

            """if metadata.get("Spherical", "") == "true":
                self.var_spherical.set(1)
            else:
                self.var_spherical.set(0)

            if metadata.get("StereoMode", "") == "top-bottom":
                self.var_3d.set(1)
            else:
                self.var_3d.set(0)
            """

        if stereo:
            stereo = stereo.values()[0]
            self.char_layout.set(stereo.stereo_mode_name());

        if audio_metadata:
            self.var_spatial_audio.set(1)
            print (audio_metadata.get_metadata_string())

        self.update_state()
Пример #6
0
    def action_open(self):
        """Triggers open file diaglog, reading a new file's metadata."""
        tmp_in_file = tkFileDialog.askopenfilename(**self.open_options)
        if not tmp_in_file:
            return
        self.in_file = tmp_in_file

        self.set_message("Current 360 video: %s" %
                         ntpath.basename(self.in_file))

        console = Console()
        parsed_metadata = metadata_utils.parse_metadata(
            self.in_file, console.append)

        metadata = None
        audio_metadata = None
        if parsed_metadata:
            metadata = parsed_metadata.video
            audio_metadata = parsed_metadata.audio

        for line in console.log:
            if "Error" in line:
                self.set_error("Failed to load file %s" %
                               ntpath.basename(self.in_file))
                self.var_spherical.set(0)
                self.var_spatial_audio.set(0)
                self.disable_state()
                self.button_open.configure(state="normal")
                return

        self.enable_state()
        self.checkbox_spherical.configure(state="normal")

        infile = os.path.abspath(self.in_file)
        file_extension = os.path.splitext(infile)[1].lower()

        self.var_spherical.set(1)
        self.enable_spatial_audio = parsed_metadata.num_audio_channels == 4

        if not metadata:
            self.var_3d.set(0)

        if not audio_metadata:
            self.var_spatial_audio.set(0)

        if metadata:
            metadata = metadata.itervalues().next()

            if metadata.get("Spherical", "") == "true":
                self.var_spherical.set(1)
            else:
                self.var_spherical.set(0)

            if metadata.get("StereoMode", "") == "top-bottom":
                self.var_3d.set(1)
            else:
                self.var_3d.set(0)

        if audio_metadata:
            self.var_spatial_audio.set(1)
            print(audio_metadata.get_metadata_string())

        self.update_state()
Пример #7
0
def main():
    """Main function for printing and injecting spatial media metadata."""

    parser = argparse.ArgumentParser(
        usage=
        "%(prog)s [options] [files...]\n\nBy default prints out spatial media "
        "metadata from specified files.")
    parser.add_argument(
        "-i",
        "--inject",
        action="store_true",
        help=
        "injects spatial media metadata into the first file specified (.mp4 or "
        ".mov) and saves the result to the second file specified")
    video_group = parser.add_argument_group("Spherical Video")
    video_group.add_argument(
        "-s",
        "--stereo",
        action="store",
        dest="stereo_mode",
        metavar="STEREO-MODE",
        choices=["none", "top-bottom", "left-right"],
        default="none",
        help="stereo mode (none | top-bottom | left-right)")
    video_group.add_argument(
        "-c",
        "--crop",
        action="store",
        default=None,
        help=
        "crop region. Must specify 6 integers in the form of \"w:h:f_w:f_h:x:y\""
        " where w=CroppedAreaImageWidthPixels h=CroppedAreaImageHeightPixels "
        "f_w=FullPanoWidthPixels f_h=FullPanoHeightPixels "
        "x=CroppedAreaLeftPixels y=CroppedAreaTopPixels")
    audio_group = parser.add_argument_group("Spatial Audio")
    audio_group.add_argument(
        "-a",
        "--spatial-audio",
        action="store_true",
        help="spatial audio. First-order periphonic ambisonics with ACN channel "
        "ordering and SN3D normalization")
    parser.add_argument("file", nargs="+", help="input/output files")

    args = parser.parse_args()

    if args.inject:
        if len(args.file) != 2:
            console(
                "Injecting metadata requires both an input file and output file."
            )
            return

        metadata = metadata_utils.Metadata()
        metadata.video = metadata_utils.generate_spherical_xml(
            args.stereo_mode, args.crop)

        if args.spatial_audio:
            metadata.audio = metadata_utils.SPATIAL_AUDIO_DEFAULT_METADATA

        if metadata.video:
            metadata_utils.inject_metadata(args.file[0], args.file[1],
                                           metadata, console)
        else:
            console("Failed to generate metadata.")
        return

    if len(args.file) > 0:
        for input_file in args.file:
            metadata_utils.parse_metadata(input_file, console)
        return

    parser.print_help()
    return
Пример #8
0
def main():
    """Main function for printing and injecting spatial media metadata."""

    parser = argparse.ArgumentParser(
        usage=
        "%(prog)s [options] [files...]\n\nBy default prints out spatial media "
        "metadata from specified files.")
    parser.add_argument(
        "-i",
        "--inject",
        action="store_true",
        help=
        "injects spatial media metadata into the first file specified (.mp4 or "
        ".mov) and saves the result to the second file specified")

    video_group = parser.add_argument_group("Spherical Video")
    video_group.add_argument(
        "-s",
        "--stereo",
        action="store",
        dest="stereo_mode",
        metavar="STEREO-MODE",
        choices=["none", "top-bottom", "left-right", "custom"],
        default=None,
        help="stereo mode (none | top-bottom | left-right | custom)")
    video_group.add_argument(
        "-m",
        "--projection",
        action="store",
        dest="projection",
        metavar="SPHERICAL-MODE",
        choices=[
            "equirectangular", "cubemap", "mesh", "full-frame", "equi-mesh"
        ],
        default=None,
        help=
        "projection (equirectangular | cubemap | mesh | full-frame | equi-mesh)"
    )
    video_group.add_argument("-y",
                             "--yaw",
                             action="store",
                             dest="yaw",
                             metavar="YAW",
                             default=0,
                             help="yaw")
    video_group.add_argument("-p",
                             "--pitch",
                             action="store",
                             dest="pitch",
                             metavar="PITCH",
                             default=0,
                             help="pitch")
    video_group.add_argument("-r",
                             "--roll",
                             action="store",
                             dest="roll",
                             metavar="ROLL",
                             default=0,
                             help="roll")
    video_group.add_argument("-d",
                             "--degrees",
                             action="store",
                             dest="degrees",
                             metavar="DEGREES",
                             choices=["180", "360"],
                             default=180,
                             help="degrees")
    video_group.add_argument(
        "-c",
        "--correction",
        action="store",
        dest="fisheye_correction",
        metavar="FISHEYE-CORRECTION",
        default="0:0:0:0",
        help=
        "polynomial fisheye lens correction (n1:n2:n3:n4) e.g 0.5:-0.1:0.2:-0.0005"
    )
    video_group.add_argument(
        "-v",
        "--view",
        action="store",
        dest="field_of_view",
        metavar="FIELD-OF-VIEW",
        default="0x0",
        help="Field of view for equi_mesh or full frame. e.g. 180x180 or 16x9")

    audio_group = parser.add_argument_group("Spatial Audio")
    audio_group.add_argument(
        "-a",
        "--spatial-audio",
        action="store_true",
        help="spatial audio. First-order periphonic ambisonics with ACN channel "
        "ordering and SN3D normalization")
    parser.add_argument("file", nargs="+", help="input/output files")

    args = parser.parse_args()

    if args.inject:
        if len(args.file) != 2:
            console(
                "Injecting metadata requires both an input file and output file."
            )
            return

        metadata = metadata_utils.Metadata()

        if args.stereo_mode:
            metadata.stereo = args.stereo_mode

        if args.projection:
            metadata.spherical = args.projection
            if metadata.spherical == "equirectangular":
                metdaadata.clip_left_right = 0 if args.degrees == "360" else 1073741823

        if args.spatial_audio:
            metadata.audio = metadata_utils.SPATIAL_AUDIO_DEFAULT_METADATA

        if args.fisheye_correction:
            metadata.fisheye_correction = [
                float(x) for x in args.fisheye_correction.split(':')
            ]

        if args.field_of_view:
            metadata.fov = [float(x) for x in args.field_of_view.split('x')]
            if metadata.fov[0] == 0 or metadata.fov[1] == 0:
                if args.projection == "full-frame":
                    metadata.fov[0] = 16.0
                    metadata.fov[1] = 9.0
                else:
                    metadata.fov[0] = 180
                    metadata.fov[1] = 180

        if metadata.stereo or metadata.spherical or metadata.audio:
            metadata.orientation = {
                "yaw": args.yaw,
                "pitch": args.pitch,
                "roll": args.roll
            }
            metadata_utils.inject_metadata(args.file[0], args.file[1],
                                           metadata, console)
        else:
            console("Failed to generate metadata.")
        return

    if len(args.file) > 0:
        for input_file in args.file:
            metadata_utils.parse_metadata(input_file, console)
        return

    parser.print_help()
    return
Пример #9
0
def main():
  """Main function for printing and injecting spatial media metadata."""

  parser = argparse.ArgumentParser(
      usage=
      "%(prog)s [options] [files...]\n\nBy default prints out spatial media "
      "metadata from specified files.")
  parser.add_argument(
      "-i",
      "--inject",
      action="store_true",
      help=
      "injects spatial media metadata into the first file specified (.mp4 or "
      ".mov) and saves the result to the second file specified")
  video_group = parser.add_argument_group("Spherical Video")
  video_group.add_argument("-s",
                           "--stereo",
                           action="store",
                           dest="stereo_mode",
                           metavar="STEREO-MODE",
                           choices=["none", "top-bottom", "left-right"],
                           default="none",
                           help="stereo mode (none | top-bottom | left-right)")
  video_group.add_argument(
      "-c",
      "--crop",
      action="store",
      default=None,
      help=
      "crop region. Must specify 6 integers in the form of \"w:h:f_w:f_h:x:y\""
      " where w=CroppedAreaImageWidthPixels h=CroppedAreaImageHeightPixels "
      "f_w=FullPanoWidthPixels f_h=FullPanoHeightPixels "
      "x=CroppedAreaLeftPixels y=CroppedAreaTopPixels")
  audio_group = parser.add_argument_group("Spatial Audio")
  audio_group.add_argument(
      "-a",
      "--spatial-audio",
      action="store_true",
      help=
      "spatial audio. First-order periphonic ambisonics with ACN channel "
      "ordering and SN3D normalization")
  parser.add_argument("file", nargs="+", help="input/output files")

  args = parser.parse_args()

  if args.inject:
    if len(args.file) != 2:
      console("Injecting metadata requires both an input file and output file.")
      return

    metadata = metadata_utils.Metadata()
    metadata.video = metadata_utils.generate_spherical_xml(args.stereo_mode,
                                                           args.crop)

    if args.spatial_audio:
      metadata.audio = metadata_utils.SPATIAL_AUDIO_DEFAULT_METADATA

    if metadata.video:
      metadata_utils.inject_metadata(args.file[0], args.file[1], metadata,
                                     console)
    else:
      console("Failed to generate metadata.")
    return

  if len(args.file) > 0:
    for input_file in args.file:
      metadata_utils.parse_metadata(input_file, console)
    return

  parser.print_help()
  return