From 4dac2e0a718b4a9ac127d0fa366274559d7ad102 Mon Sep 17 00:00:00 2001 From: benfry Date: Sat, 18 Jun 2011 16:24:09 +0000 Subject: [PATCH] remove quicktime video library --- java/libraries/video/.classpath | 8 - java/libraries/video/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 268 ------- .../video/.settings/org.eclipse.jdt.ui.prefs | 4 - java/libraries/video/build.xml | 26 - .../video/examples/AsciiVideo/AsciiVideo.pde | 134 ---- .../AsciiVideo/data/UniversLTStd-Light-48.vlw | Bin 168251 -> 0 bytes .../BackgroundSubtraction.pde | 69 -- .../BrightnessThresholding.pde | 57 -- .../BrightnessTracking/BrightnessTracking.pde | 52 -- .../examples/ColorSorting/ColorSorting.pde | 145 ---- .../video/examples/ColorSorting/Tuple.pde | 29 - .../examples/DrawingMovie/DrawingMovie.pde | 48 -- .../FrameDifferencing/FrameDifferencing.pde | 64 -- .../video/examples/Framingham/Framingham.pde | 58 -- .../GettingStartedCapture.pde | 38 - .../video/examples/HsvSpace/HsvSpace.pde | 207 ----- .../video/examples/HsvSpace/Tuple.pde | 33 - .../video/examples/LivePocky/LivePocky.pde | 53 -- java/libraries/video/examples/Loop/Loop.pde | 27 - .../video/examples/Mirror/Mirror.pde | 72 -- .../video/examples/Mirror2/Mirror2.pde | 59 -- .../video/examples/Pixelate/Pixelate.pde | 48 -- .../examples/RadialPocky/RadialPocky.pde | 74 -- .../video/examples/SlitScan/SlitScan.pde | 54 -- java/libraries/video/library/.cvsignore | 1 - java/libraries/video/library/export.txt | 1 - .../video/src/processing/video/Capture.java | 549 ------------- .../video/src/processing/video/Movie.java | 735 ------------------ .../src/processing/video/MovieMaker.java | 335 -------- 30 files changed, 3265 deletions(-) delete mode 100644 java/libraries/video/.classpath delete mode 100644 java/libraries/video/.project delete mode 100644 java/libraries/video/.settings/org.eclipse.jdt.core.prefs delete mode 100644 java/libraries/video/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 java/libraries/video/build.xml delete mode 100644 java/libraries/video/examples/AsciiVideo/AsciiVideo.pde delete mode 100644 java/libraries/video/examples/AsciiVideo/data/UniversLTStd-Light-48.vlw delete mode 100644 java/libraries/video/examples/BackgroundSubtraction/BackgroundSubtraction.pde delete mode 100644 java/libraries/video/examples/BrightnessThresholding/BrightnessThresholding.pde delete mode 100644 java/libraries/video/examples/BrightnessTracking/BrightnessTracking.pde delete mode 100644 java/libraries/video/examples/ColorSorting/ColorSorting.pde delete mode 100644 java/libraries/video/examples/ColorSorting/Tuple.pde delete mode 100755 java/libraries/video/examples/DrawingMovie/DrawingMovie.pde delete mode 100644 java/libraries/video/examples/FrameDifferencing/FrameDifferencing.pde delete mode 100644 java/libraries/video/examples/Framingham/Framingham.pde delete mode 100644 java/libraries/video/examples/GettingStartedCapture/GettingStartedCapture.pde delete mode 100644 java/libraries/video/examples/HsvSpace/HsvSpace.pde delete mode 100644 java/libraries/video/examples/HsvSpace/Tuple.pde delete mode 100644 java/libraries/video/examples/LivePocky/LivePocky.pde delete mode 100644 java/libraries/video/examples/Loop/Loop.pde delete mode 100644 java/libraries/video/examples/Mirror/Mirror.pde delete mode 100644 java/libraries/video/examples/Mirror2/Mirror2.pde delete mode 100644 java/libraries/video/examples/Pixelate/Pixelate.pde delete mode 100644 java/libraries/video/examples/RadialPocky/RadialPocky.pde delete mode 100644 java/libraries/video/examples/SlitScan/SlitScan.pde delete mode 100644 java/libraries/video/library/.cvsignore delete mode 100644 java/libraries/video/library/export.txt delete mode 100755 java/libraries/video/src/processing/video/Capture.java delete mode 100644 java/libraries/video/src/processing/video/Movie.java delete mode 100644 java/libraries/video/src/processing/video/MovieMaker.java diff --git a/java/libraries/video/.classpath b/java/libraries/video/.classpath deleted file mode 100644 index d87393ef9..000000000 --- a/java/libraries/video/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/java/libraries/video/.project b/java/libraries/video/.project deleted file mode 100644 index aa59004d2..000000000 --- a/java/libraries/video/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - processing-video - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/java/libraries/video/.settings/org.eclipse.jdt.core.prefs b/java/libraries/video/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 9e8d707a6..000000000 --- a/java/libraries/video/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,268 +0,0 @@ -#Wed Nov 04 22:32:11 EST 2009 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=18 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=18 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=18 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=18 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=1 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert -org.eclipse.jdt.core.formatter.comment.line_length=80 -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=2 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.lineSplit=80 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.tabulation.size=2 -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true diff --git a/java/libraries/video/.settings/org.eclipse.jdt.ui.prefs b/java/libraries/video/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index b9df1ce8d..000000000 --- a/java/libraries/video/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,4 +0,0 @@ -#Tue Sep 30 10:42:04 EDT 2008 -eclipse.preferences.version=1 -formatter_profile=_two spaces no tabs -formatter_settings_version=11 diff --git a/java/libraries/video/build.xml b/java/libraries/video/build.xml deleted file mode 100644 index 4a7196504..000000000 --- a/java/libraries/video/build.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/libraries/video/examples/AsciiVideo/AsciiVideo.pde b/java/libraries/video/examples/AsciiVideo/AsciiVideo.pde deleted file mode 100644 index 5bcac9e7b..000000000 --- a/java/libraries/video/examples/AsciiVideo/AsciiVideo.pde +++ /dev/null @@ -1,134 +0,0 @@ -/** - * ASCII Video - * by Ben Fry. - * - * Text characters have been used to represent images since the earliest computers. - * This sketch is a simple homage that re-interprets live video as ASCII text. - * See the keyPressed function for more options, like changing the font size. - */ - -import processing.video.*; - -Capture video; -boolean cheatScreen; - -// All ASCII characters, sorted according to their visual density -String letterOrder = - " .`-_':,;^=+/\"|)\\<>)iv%xclrs{*}I?!][1taeo7zjLu" + - "nT#JCwfy325Fp6mqSghVd4EgXPGZbYkOA&8U$@KHDBWNMR0Q"; -char[] letters; - -float[] bright; -char[] chars; - -PFont font; -float fontSize = 1.5; - - -public void setup() { - size(640, 480, P2D); - // Or run full screen, more fun! Use with Sketch -> Present - //size(screen.width, screen.height, OPENGL); - - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, 80, 60, 15); - int count = video.width * video.height; - - font = loadFont("UniversLTStd-Light-48.vlw"); - - // for the 256 levels of brightness, distribute the letters across - // the an array of 256 elements to use for the lookup - letters = new char[256]; - for (int i = 0; i < 256; i++) { - int index = int(map(i, 0, 256, 0, letterOrder.length())); - letters[i] = letterOrder.charAt(index); - } - - // current characters for each position in the video - chars = new char[count]; - - // current brightness for each point - bright = new float[count]; - for (int i = 0; i < count; i++) { - // set each brightness at the midpoint to start - bright[i] = 128; - } -} - - -public void captureEvent(Capture c) { - c.read(); -} - - -void draw() { - background(0); - - pushMatrix(); - - float hgap = width / float(video.width); - float vgap = height / float(video.height); - - scale(max(hgap, vgap) * fontSize); - textFont(font, fontSize); - - int index = 0; - for (int y = 1; y < video.height; y++) { - - // Move down for next line - translate(0, 1.0 / fontSize); - - pushMatrix(); - for (int x = 0; x < video.width; x++) { - int pixelColor = video.pixels[index]; - // Faster method of calculating r, g, b than red(), green(), blue() - int r = (pixelColor >> 16) & 0xff; - int g = (pixelColor >> 8) & 0xff; - int b = pixelColor & 0xff; - - // Another option would be to properly calculate brightness as luminance: - // luminance = 0.3*red + 0.59*green + 0.11*blue - // Or you could instead red + green + blue, and make the the values[] array - // 256*3 elements long instead of just 256. - int pixelBright = max(r, g, b); - - // The 0.1 value is used to damp the changes so that letters flicker less - float diff = pixelBright - bright[index]; - bright[index] += diff * 0.1; - - fill(pixelColor); - int num = int(bright[index]); - text(letters[num], 0, 0); - - // Move to the next pixel - index++; - - // Move over for next character - translate(1.0 / fontSize, 0); - } - popMatrix(); - } - popMatrix(); - - if (cheatScreen) { - //image(video, 0, height - video.height); - // set() is faster than image() when drawing untransformed images - set(0, height - video.height, video); - } -} - - -/** - * Handle key presses: - * 'c' toggles the cheat screen that shows the original image in the corner - * 'g' grabs an image and saves the frame to a tiff image - * 'f' and 'F' increase and decrease the font size - */ -public void keyPressed() { - switch (key) { - case 'g': saveFrame(); break; - case 'c': cheatScreen = !cheatScreen; break; - case 'f': fontSize *= 1.1; break; - case 'F': fontSize *= 0.9; break; - } -} diff --git a/java/libraries/video/examples/AsciiVideo/data/UniversLTStd-Light-48.vlw b/java/libraries/video/examples/AsciiVideo/data/UniversLTStd-Light-48.vlw deleted file mode 100644 index 0d624969b37a0269535392d129a5e6226a6fc966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168251 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 diff --git a/java/libraries/video/examples/BackgroundSubtraction/BackgroundSubtraction.pde b/java/libraries/video/examples/BackgroundSubtraction/BackgroundSubtraction.pde deleted file mode 100644 index ad008386e..000000000 --- a/java/libraries/video/examples/BackgroundSubtraction/BackgroundSubtraction.pde +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Background Subtraction - * by Golan Levin. - * - * Detect the presence of people and objects in the frame using a simple - * background-subtraction technique. To initialize the background, press a key. - */ - - -import processing.video.*; - -int numPixels; -int[] backgroundPixels; -Capture video; - -void setup() { - // Change size to 320 x 240 if too slow at 640 x 480 - size(640, 480, P2D); - - video = new Capture(this, width, height, 24); - numPixels = video.width * video.height; - // Create array to store the background image - backgroundPixels = new int[numPixels]; - // Make the pixels[] array available for direct manipulation - loadPixels(); -} - -void draw() { - if (video.available()) { - video.read(); // Read a new video frame - video.loadPixels(); // Make the pixels of video available - // Difference between the current frame and the stored background - int presenceSum = 0; - for (int i = 0; i < numPixels; i++) { // For each pixel in the video frame... - // Fetch the current color in that location, and also the color - // of the background in that spot - color currColor = video.pixels[i]; - color bkgdColor = backgroundPixels[i]; - // Extract the red, green, and blue components of the current pixel’s color - int currR = (currColor >> 16) & 0xFF; - int currG = (currColor >> 8) & 0xFF; - int currB = currColor & 0xFF; - // Extract the red, green, and blue components of the background pixel’s color - int bkgdR = (bkgdColor >> 16) & 0xFF; - int bkgdG = (bkgdColor >> 8) & 0xFF; - int bkgdB = bkgdColor & 0xFF; - // Compute the difference of the red, green, and blue values - int diffR = abs(currR - bkgdR); - int diffG = abs(currG - bkgdG); - int diffB = abs(currB - bkgdB); - // Add these differences to the running tally - presenceSum += diffR + diffG + diffB; - // Render the difference image to the screen - //pixels[i] = color(diffR, diffG, diffB); - // The following line does the same thing much faster, but is more technical - pixels[i] = 0xFF000000 | (diffR << 16) | (diffG << 8) | diffB; - } - updatePixels(); // Notify that the pixels[] array has changed - println(presenceSum); // Print out the total amount of movement - } -} - -// When a key is pressed, capture the background image into the backgroundPixels -// buffer, by copying each of the current frame’s pixels into it. -void keyPressed() { - video.loadPixels(); - arraycopy(video.pixels, backgroundPixels); -} - diff --git a/java/libraries/video/examples/BrightnessThresholding/BrightnessThresholding.pde b/java/libraries/video/examples/BrightnessThresholding/BrightnessThresholding.pde deleted file mode 100644 index 24a0a376e..000000000 --- a/java/libraries/video/examples/BrightnessThresholding/BrightnessThresholding.pde +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Brightness Thresholding - * by Golan Levin. - * - * Determines whether a test location (such as the cursor) is contained within - * the silhouette of a dark object. - */ - - -import processing.video.*; - -color black = color(0); -color white = color(255); -int numPixels; -Capture video; - -void setup() { - size(640, 480); // Change size to 320 x 240 if too slow at 640 x 480 - strokeWeight(5); - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, width, height, 24); - numPixels = video.width * video.height; - noCursor(); - smooth(); -} - -void draw() { - if (video.available()) { - video.read(); - video.loadPixels(); - int threshold = 127; // Set the threshold value - float pixelBrightness; // Declare variable to store a pixel's color - // Turn each pixel in the video frame black or white depending on its brightness - loadPixels(); - for (int i = 0; i < numPixels; i++) { - pixelBrightness = brightness(video.pixels[i]); - if (pixelBrightness > threshold) { // If the pixel is brighter than the - pixels[i] = white; // threshold value, make it white - } - else { // Otherwise, - pixels[i] = black; // make it black - } - } - updatePixels(); - // Test a location to see where it is contained. Fetch the pixel at the test - // location (the cursor), and compute its brightness - int testValue = get(mouseX, mouseY); - float testBrightness = brightness(testValue); - if (testBrightness > threshold) { // If the test location is brighter than - fill(black); // the threshold set the fill to black - } - else { // Otherwise, - fill(white); // set the fill to white - } - ellipse(mouseX, mouseY, 20, 20); - } -} diff --git a/java/libraries/video/examples/BrightnessTracking/BrightnessTracking.pde b/java/libraries/video/examples/BrightnessTracking/BrightnessTracking.pde deleted file mode 100644 index 2cdb2e15c..000000000 --- a/java/libraries/video/examples/BrightnessTracking/BrightnessTracking.pde +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Brightness Tracking - * by Golan Levin. - * - * Tracks the brightest pixel in a live video signal. - */ - - -import processing.video.*; - -Capture video; - -void setup() { - size(640, 480); // Change size to 320 x 240 if too slow at 640 x 480 - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, width, height, 30); - noStroke(); - smooth(); -} - -void draw() { - if (video.available()) { - video.read(); - image(video, 0, 0, width, height); // Draw the webcam video onto the screen - int brightestX = 0; // X-coordinate of the brightest video pixel - int brightestY = 0; // Y-coordinate of the brightest video pixel - float brightestValue = 0; // Brightness of the brightest video pixel - // Search for the brightest pixel: For each row of pixels in the video image and - // for each pixel in the yth row, compute each pixel's index in the video - video.loadPixels(); - int index = 0; - for (int y = 0; y < video.height; y++) { - for (int x = 0; x < video.width; x++) { - // Get the color stored in the pixel - int pixelValue = video.pixels[index]; - // Determine the brightness of the pixel - float pixelBrightness = brightness(pixelValue); - // If that value is brighter than any previous, then store the - // brightness of that pixel, as well as its (x,y) location - if (pixelBrightness > brightestValue) { - brightestValue = pixelBrightness; - brightestY = y; - brightestX = x; - } - index++; - } - } - // Draw a large, yellow circle at the brightest pixel - fill(255, 204, 0, 128); - ellipse(brightestX, brightestY, 200, 200); - } -} diff --git a/java/libraries/video/examples/ColorSorting/ColorSorting.pde b/java/libraries/video/examples/ColorSorting/ColorSorting.pde deleted file mode 100644 index dd39f5bb0..000000000 --- a/java/libraries/video/examples/ColorSorting/ColorSorting.pde +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Color Sorting - * by Ben Fry. - * - * Example that sorts all colors from the incoming video - * and arranges them into vertical bars. - */ - - -import processing.video.*; - -Capture video; -boolean cheatScreen; - -Tuple[] captureColors; -Tuple[] drawColors; -int[] bright; - -// How many pixels to skip in either direction -int increment = 5; - - -void setup() { - size(800, 600, P3D); - - noCursor(); - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, 80, 60, 15); - - int count = (video.width * video.height) / (increment * increment); - bright = new int[count]; - captureColors = new Tuple[count]; - drawColors = new Tuple[count]; - for (int i = 0; i < count; i++) { - captureColors[i] = new Tuple(); - drawColors[i] = new Tuple(0.5, 0.5, 0.5); - } -} - - -void draw() { - if (video.available()) { - video.read(); - - background(0); - noStroke(); - - int index = 0; - for (int j = 0; j < video.height; j += increment) { - for (int i = 0; i < video.width; i += increment) { - int pixelColor = video.pixels[j*video.width + i]; - - int r = (pixelColor >> 16) & 0xff; - int g = (pixelColor >> 8) & 0xff; - int b = pixelColor & 0xff; - - // Technically would be sqrt of the following, but no need to do - // sqrt before comparing the elements since we're only ordering - bright[index] = r*r + g*g + b*b; - captureColors[index].set(r, g, b); - - index++; - } - } - sort(index, bright, captureColors); - - beginShape(QUAD_STRIP); - for (int i = 0; i < index; i++) { - drawColors[i].target(captureColors[i], 0.1); - drawColors[i].phil(); - - float x = map(i, 0, index, 0, width); - vertex(x, 0); - vertex(x, height); - } - endShape(); - - if (cheatScreen) { - //image(video, 0, height - video.height); - // Faster method of displaying pixels array on screen - set(0, height - video.height, video); - } - } -} - - -void keyPressed() { - if (key == 'g') { - saveFrame(); - } - else if (key == 'c') { - cheatScreen = !cheatScreen; - } -} - - -// Functions to handle sorting the color data - - -void sort(int length, int[] a, Tuple[] stuff) { - sortSub(a, stuff, 0, length - 1); -} - - -void sortSwap(int[] a, Tuple[] stuff, int i, int j) { - int T = a[i]; - a[i] = a[j]; - a[j] = T; - - Tuple v = stuff[i]; - stuff[i] = stuff[j]; - stuff[j] = v; -} - - -void sortSub(int[] a, Tuple[] stuff, int lo0, int hi0) { - int lo = lo0; - int hi = hi0; - int mid; - - if (hi0 > lo0) { - mid = a[(lo0 + hi0) / 2]; - - while (lo <= hi) { - while ((lo < hi0) && (a[lo] < mid)) { - ++lo; - } - while ((hi > lo0) && (a[hi] > mid)) { - --hi; - } - if (lo <= hi) { - sortSwap(a, stuff, lo, hi); - ++lo; - --hi; - } - } - - if (lo0 < hi) - sortSub(a, stuff, lo0, hi); - - if (lo < hi0) - sortSub(a, stuff, lo, hi0); - } -} - diff --git a/java/libraries/video/examples/ColorSorting/Tuple.pde b/java/libraries/video/examples/ColorSorting/Tuple.pde deleted file mode 100644 index c3d8b5900..000000000 --- a/java/libraries/video/examples/ColorSorting/Tuple.pde +++ /dev/null @@ -1,29 +0,0 @@ -// Simple vector class that holds an x,y,z position. - -class Tuple { - float x, y, z; - - Tuple() { } - - Tuple(float x, float y, float z) { - set(x, y, z); - } - - void set(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - } - - void target(Tuple another, float amount) { - float amount1 = 1.0 - amount; - x = x*amount1 + another.x*amount; - y = y*amount1 + another.y*amount; - z = z*amount1 + another.z*amount; - } - - void phil() { - fill(x, y, z); - } -} - diff --git a/java/libraries/video/examples/DrawingMovie/DrawingMovie.pde b/java/libraries/video/examples/DrawingMovie/DrawingMovie.pde deleted file mode 100755 index 890e129a1..000000000 --- a/java/libraries/video/examples/DrawingMovie/DrawingMovie.pde +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Drawing Movie. - * - * Makes a QuickTime movie of a line drawn by the mouse. Press - * the spacebar to finish and save the movie. - */ - -import processing.video.*; - -MovieMaker mm; - -void setup() { - size(320, 240); - - // Save uncompressed, at 15 frames per second - mm = new MovieMaker(this, width, height, "drawing.mov"); - - // Or, set specific compression and frame rate options - //mm = new MovieMaker(this, width, height, "drawing.mov", 30, - // MovieMaker.ANIMATION, MovieMaker.HIGH); - - background(160, 32, 32); -} - - -void draw() { - stroke(7, 146, 168); - strokeWeight(4); - - // Draw if mouse is pressed - if (mousePressed && pmouseX != 0 && mouseY != 0) { - line(pmouseX, pmouseY, mouseX, mouseY); - } - - // Add window's pixels to movie - mm.addFrame(); -} - - -void keyPressed() { - if (key == ' ') { - // Finish the movie if space bar is pressed - mm.finish(); - // Quit running the sketch once the file is written - exit(); - } -} - diff --git a/java/libraries/video/examples/FrameDifferencing/FrameDifferencing.pde b/java/libraries/video/examples/FrameDifferencing/FrameDifferencing.pde deleted file mode 100644 index 9f23535f0..000000000 --- a/java/libraries/video/examples/FrameDifferencing/FrameDifferencing.pde +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Frame Differencing - * by Golan Levin. - * - * Quantify the amount of movement in the video frame using frame-differencing. - */ - - -import processing.video.*; - -int numPixels; -int[] previousFrame; -Capture video; - -void setup() { - size(640, 480); // Change size to 320 x 240 if too slow at 640 x 480 - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, width, height, 24); - numPixels = video.width * video.height; - // Create an array to store the previously captured frame - previousFrame = new int[numPixels]; - loadPixels(); -} - -void draw() { - if (video.available()) { - // When using video to manipulate the screen, use video.available() and - // video.read() inside the draw() method so that it's safe to draw to the screen - video.read(); // Read the new frame from the camera - video.loadPixels(); // Make its pixels[] array available - - int movementSum = 0; // Amount of movement in the frame - for (int i = 0; i < numPixels; i++) { // For each pixel in the video frame... - color currColor = video.pixels[i]; - color prevColor = previousFrame[i]; - // Extract the red, green, and blue components from current pixel - int currR = (currColor >> 16) & 0xFF; // Like red(), but faster - int currG = (currColor >> 8) & 0xFF; - int currB = currColor & 0xFF; - // Extract red, green, and blue components from previous pixel - int prevR = (prevColor >> 16) & 0xFF; - int prevG = (prevColor >> 8) & 0xFF; - int prevB = prevColor & 0xFF; - // Compute the difference of the red, green, and blue values - int diffR = abs(currR - prevR); - int diffG = abs(currG - prevG); - int diffB = abs(currB - prevB); - // Add these differences to the running tally - movementSum += diffR + diffG + diffB; - // Render the difference image to the screen - pixels[i] = color(diffR, diffG, diffB); - // The following line is much faster, but more confusing to read - //pixels[i] = 0xff000000 | (diffR << 16) | (diffG << 8) | diffB; - // Save the current color into the 'previous' buffer - previousFrame[i] = currColor; - } - // To prevent flicker from frames that are all black (no movement), - // only update the screen if the image has changed. - if (movementSum > 0) { - updatePixels(); - println(movementSum); // Print the total amount of movement to the console - } - } -} diff --git a/java/libraries/video/examples/Framingham/Framingham.pde b/java/libraries/video/examples/Framingham/Framingham.pde deleted file mode 100644 index fabbb827e..000000000 --- a/java/libraries/video/examples/Framingham/Framingham.pde +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Framingham - * by Ben Fry. - * - * Show subsequent frames from video input as a grid. Also fun with movie files. - */ - - -import processing.video.*; - -Capture video; -int column; -int columnCount; -int lastRow; - -// Buffer used to move all the pixels up -int[] scoot; - - -void setup() { - size(640, 480, P2D); - - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, 32, 24); - // Also try with other video sizes - - column = 0; - columnCount = width / video.width; - int rowCount = height / video.height; - lastRow = rowCount - 1; - - scoot = new int[lastRow*video.height * width]; - background(0); -} - - -void draw() { - // By using video.available, only the frame rate need be set inside setup() - if (video.available()) { - video.read(); - set(video.width*column, video.height*lastRow, video); - column++; - if (column == columnCount) { - loadPixels(); - - // Scoot everybody up one row - arraycopy(pixels, video.height*width, scoot, 0, scoot.length); - arraycopy(scoot, 0, pixels, 0, scoot.length); - - // Set the moved row to black - for (int i = scoot.length; i < width*height; i++) { - pixels[i] = #000000; - } - column = 0; - updatePixels(); - } - } -} diff --git a/java/libraries/video/examples/GettingStartedCapture/GettingStartedCapture.pde b/java/libraries/video/examples/GettingStartedCapture/GettingStartedCapture.pde deleted file mode 100644 index a7908b547..000000000 --- a/java/libraries/video/examples/GettingStartedCapture/GettingStartedCapture.pde +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Getting Started with Capture. - * - * Reading and displaying an image from an attached Capture device. - */ - -import processing.video.*; - -Capture cam; - -void setup() { - size(640, 480); - - // If no device is specified, will just use the default. - cam = new Capture(this, 320, 240); - - // To use another device (i.e. if the default device causes an error), - // list all available capture devices to the console to find your camera. - //String[] devices = Capture.list(); - //println(devices); - - // Change devices[0] to the proper index for your camera. - //cam = new Capture(this, width, height, devices[0]); - - // Opens the settings page for this capture device. - //camera.settings(); -} - - -void draw() { - if (cam.available() == true) { - cam.read(); - image(cam, 160, 100); - // The following does the same, and is faster when just drawing the image - // without any additional resizing, transformations, or tint. - //set(160, 100, cam); - } -} diff --git a/java/libraries/video/examples/HsvSpace/HsvSpace.pde b/java/libraries/video/examples/HsvSpace/HsvSpace.pde deleted file mode 100644 index 909c404d1..000000000 --- a/java/libraries/video/examples/HsvSpace/HsvSpace.pde +++ /dev/null @@ -1,207 +0,0 @@ -/** - * HSV Space - * by Ben Fry. - * - * Arrange the pixels from live video into the HSV Color Cone. - */ - -import java.awt.Color; - -import processing.opengl.*; -import processing.video.*; - -Capture video; -int count; -boolean cheatScreen = true; - -static final float BOX_SIZE = 0.75; -static final float CONE_HEIGHT = 1.2; -static final float MAX_RADIUS = 10; -static final float ROT_INCREMENT = 3.0; -static final float TRANS_INCREMENT = 1; -static final float STEP_AMOUNT = 0.1; - -Tuple[] farbe; -Tuple[] trans; - -float[] hsb = new float[3]; - -float leftRightAngle; -float upDownAngle; -float fwdBackTrans; -float upDownTrans; -float leftRightTrans; -boolean motion; - -boolean blobby = false; - - -void setup() { - size(640, 480, P3D); - //size(screen.width, screen.height, OPENGL); - - video = new Capture(this, 40, 30, 15); - count = video.width * video.height; - - sphereDetail(60); - - upDownTrans = 0; - leftRightTrans = 0; - motion = false; - - leftRightAngle = 101.501297; - upDownAngle = -180.098694; - fwdBackTrans = 14.800003; - - farbe = new Tuple[count]; - trans = new Tuple[count]; - for (int i = 0; i < count; i++) { - farbe[i] = new Tuple(); - trans[i] = new Tuple(); - } -} - - -void draw() { - background(0); - - if (!blobby) lights(); - - pushMatrix(); - translate(width/2, height/2); - scale(min(width, height) / 10.0); - - translate(0, 0, -20 + fwdBackTrans); - rotateY(radians(36 + leftRightAngle)); //, 0, 1, 0); - rotateX(radians(-228 + upDownAngle)); //, 1, 0, 0); - - if (blobby) { - stroke(0.35, 0.35, 0.25, 0.15); - wireCone(MAX_RADIUS, MAX_RADIUS * CONE_HEIGHT, 18, 18); - } - else { - stroke(0.35, 0.35, 0.25, 0.25); - wireCone(MAX_RADIUS, MAX_RADIUS * CONE_HEIGHT, 180, 18); - } - - noStroke(); - for (int i = 0; i < count; i++) { - int pixelColor = video.pixels[i]; - int r = (pixelColor >> 16) & 0xff; - int g = (pixelColor >> 8) & 0xff; - int b = pixelColor & 0xff; - Color.RGBtoHSB(r, g, b, hsb); - - float radius = hsb[1] * hsb[2]; - float angle = hsb[0] * 360.0 * DEG_TO_RAD; - float nx = MAX_RADIUS * radius * cos(angle); - float ny = MAX_RADIUS * radius * sin(angle); - float nz = hsb[2] * MAX_RADIUS * CONE_HEIGHT; - - trans[i].set(trans[i].x - (trans[i].x - nx)*STEP_AMOUNT, - trans[i].y - (trans[i].y - ny)*STEP_AMOUNT, - trans[i].z - (trans[i].z - nz)*STEP_AMOUNT); - - farbe[i].set(farbe[i].x - (farbe[i].x - r)*STEP_AMOUNT, - farbe[i].y - (farbe[i].y - g)*STEP_AMOUNT, - farbe[i].z - (farbe[i].z - b)*STEP_AMOUNT); - - pushMatrix(); - farbe[i].phil(); - trans[i].tran(); - - rotate(radians(45), 1, 1, 0); - if (blobby) { - sphere(BOX_SIZE * 2); //, 20, 20); - } else { - box(BOX_SIZE); - } - - popMatrix(); - } - popMatrix(); - - if (motion) { - upDownAngle--; - leftRightAngle--; - } - - if (cheatScreen) { - image(video, 0, height - video.height); - } -} - - -void captureEvent(Capture c) { - c.read(); - c.loadPixels(); -} - - -void keyPressed() { - switch (key) { - case 'g': - saveFrame(); - break; - case 'c': - cheatScreen = !cheatScreen; - break; - - case 'm': - motion = !motion; - break; - case '=': - fwdBackTrans += TRANS_INCREMENT; - break; - case '-': - fwdBackTrans -= TRANS_INCREMENT; - break; - case 'b': - blobby = !blobby; - break; - } -} - - -void mouseDragged() { - float dX, dY; - - switch (mouseButton) { - case LEFT: // left right up down - dX = pmouseX - mouseX; - dY = pmouseY - mouseY; - leftRightAngle -= dX * 0.2; - upDownAngle += dY * 0.4; - break; - - case CENTER: - dX = pmouseX - mouseX; - dY = pmouseY - mouseY; - leftRightTrans -= TRANS_INCREMENT * dX; - upDownTrans -= TRANS_INCREMENT * dY; - break; - - case RIGHT: // in and out - dY = (float) (pmouseY - mouseY); - fwdBackTrans -= TRANS_INCREMENT * dY; - break; - } -} - - -void wireCone(float radius, float height, int stepX, int stepY) { - int steps = 10; - stroke(40); - for (int i = 0; i < steps; i++) { - float angle = map(i, 0, steps, 0, TWO_PI); - float x = radius * cos(angle); - float y = radius * sin(angle); - line(x, y, height, 0, 0, 0); - } - noFill(); - pushMatrix(); - translate(0, 0, height); - ellipseMode(CENTER_RADIUS); - ellipse(0, 0, radius, radius); - popMatrix(); -} diff --git a/java/libraries/video/examples/HsvSpace/Tuple.pde b/java/libraries/video/examples/HsvSpace/Tuple.pde deleted file mode 100644 index 19c1507aa..000000000 --- a/java/libraries/video/examples/HsvSpace/Tuple.pde +++ /dev/null @@ -1,33 +0,0 @@ -// Simple vector class that holds an x,y,z position. - -class Tuple { - float x, y, z; - - Tuple() { } - - Tuple(float x, float y, float z) { - set(x, y, z); - } - - void set(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - } - - void target(Tuple another, float amount) { - float amount1 = 1.0 - amount; - x = x*amount1 + another.x*amount; - y = y*amount1 + another.y*amount; - z = z*amount1 + another.z*amount; - } - - void phil() { - fill(x, y, z); - } - - void tran() { - translate(x, y, z); - } -} - diff --git a/java/libraries/video/examples/LivePocky/LivePocky.pde b/java/libraries/video/examples/LivePocky/LivePocky.pde deleted file mode 100644 index 073d86af1..000000000 --- a/java/libraries/video/examples/LivePocky/LivePocky.pde +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Live Pocky - * by Ben Fry. - * - * Unwrap each frame of live video into a single line of pixels. - */ - -import processing.video.*; - -Capture video; -int count; -int writeRow; -int maxRows; -int topRow; -int buffer[]; - - -void setup() { - size(600, 400); - - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, 30, 20); - - maxRows = height * 2; - buffer = new int[width * maxRows]; - writeRow = height - 1; - topRow = 0; - - //frameRate(10); - background(0); - loadPixels(); -} - - -void draw() { - for (int y = 0; y < height; y++) { - int row = (topRow + y) % maxRows; - arraycopy(buffer, row * width, g.pixels, y*width, width); - } - updatePixels(); -} - - -void captureEvent(Capture c) { - c.read(); - c.loadPixels(); - arraycopy(c.pixels, 0, buffer, writeRow * width, width); - writeRow++; - if (writeRow == maxRows) { - writeRow = 0; - } - topRow++; -} diff --git a/java/libraries/video/examples/Loop/Loop.pde b/java/libraries/video/examples/Loop/Loop.pde deleted file mode 100644 index cce3107a2..000000000 --- a/java/libraries/video/examples/Loop/Loop.pde +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Loop. - * - * Move the cursor across the screen to draw. - * Shows how to load and play a QuickTime movie file. - */ - -import processing.video.*; - -Movie myMovie; - -void setup() { - size(640, 480, P2D); - background(0); - // Load and play the video in a loop - myMovie = new Movie(this, "station.mov"); - myMovie.loop(); -} - -void movieEvent(Movie myMovie) { - myMovie.read(); -} - -void draw() { - tint(255, 20); - image(myMovie, mouseX-myMovie.width/2, mouseY-myMovie.height/2); -} diff --git a/java/libraries/video/examples/Mirror/Mirror.pde b/java/libraries/video/examples/Mirror/Mirror.pde deleted file mode 100644 index 8c770c417..000000000 --- a/java/libraries/video/examples/Mirror/Mirror.pde +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Mirror - * by Daniel Shiffman. - * - * Each pixel from the video source is drawn as a rectangle with rotation based on brightness. - */ - - -import processing.video.*; - -// Size of each cell in the grid -int cellSize = 20; -// Number of columns and rows in our system -int cols, rows; -// Variable for capture device -Capture video; - - -void setup() { - size(640, 480, P2D); - frameRate(30); - cols = width / cellSize; - rows = height / cellSize; - colorMode(RGB, 255, 255, 255, 100); - - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, width, height, 12); - - background(0); -} - - -void draw() { - if (video.available()) { - video.read(); - video.loadPixels(); - - // Not bothering to clear background - // background(0); - - // Begin loop for columns - for (int i = 0; i < cols; i++) { - // Begin loop for rows - for (int j = 0; j < rows; j++) { - - // Where are we, pixel-wise? - int x = i*cellSize; - int y = j*cellSize; - int loc = (video.width - x - 1) + y*video.width; // Reversing x to mirror the image - - float r = red(video.pixels[loc]); - float g = green(video.pixels[loc]); - float b = blue(video.pixels[loc]); - // Make a new color with an alpha component - color c = color(r, g, b, 75); - - // Code for drawing a single rect - // Using translate in order for rotation to work properly - pushMatrix(); - translate(x+cellSize/2, y+cellSize/2); - // Rotation formula based on brightness - rotate((2 * PI * brightness(c) / 255.0)); - rectMode(CENTER); - fill(c); - noStroke(); - // Rects are larger than the cell for some overlap - rect(0, 0, cellSize+6, cellSize+6); - popMatrix(); - } - } - } -} diff --git a/java/libraries/video/examples/Mirror2/Mirror2.pde b/java/libraries/video/examples/Mirror2/Mirror2.pde deleted file mode 100644 index a81740af9..000000000 --- a/java/libraries/video/examples/Mirror2/Mirror2.pde +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Mirror 2 - * by Daniel Shiffman. - * - * Each pixel from the video source is drawn as a rectangle with size based on brightness. - */ - -import processing.video.*; - -// Size of each cell in the grid -int cellSize = 15; -// Number of columns and rows in our system -int cols, rows; -// Variable for capture device -Capture video; - - -void setup() { - size(630, 480, P2D); - //set up columns and rows - cols = width / cellSize; - rows = height / cellSize; - colorMode(RGB, 255, 255, 255, 100); - rectMode(CENTER); - - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, width, height, 15); - - background(0); -} - - -void draw() { - if (video.available()) { - video.read(); - video.loadPixels(); - - background(0, 0, 255); - - // Begin loop for columns - for (int i = 0; i < cols;i++) { - // Begin loop for rows - for (int j = 0; j < rows;j++) { - - // Where are we, pixel-wise? - int x = i * cellSize; - int y = j * cellSize; - int loc = (video.width - x - 1) + y*video.width; // Reversing x to mirror the image - - // Each rect is colored white with a size determined by brightness - color c = video.pixels[loc]; - float sz = (brightness(c) / 255.0) * cellSize; - fill(255); - noStroke(); - rect(x + cellSize/2, y + cellSize/2, sz, sz); - } - } - } -} diff --git a/java/libraries/video/examples/Pixelate/Pixelate.pde b/java/libraries/video/examples/Pixelate/Pixelate.pde deleted file mode 100644 index dac01fa86..000000000 --- a/java/libraries/video/examples/Pixelate/Pixelate.pde +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Pixelate - * by Hernando Barragan. - * - * Load a QuickTime file and display the video signal - * using rectangles as pixels by reading the values stored - * in the current video frame pixels array. - */ - - -import processing.video.*; - -int numPixels; -int blockSize = 10; -Movie myMovie; -color myMovieColors[]; - -void setup() { - size(640, 480, P2D); - noStroke(); - background(0); - myMovie = new Movie(this, "station.mov"); - myMovie.loop(); - numPixels = width / blockSize; - myMovieColors = new color[numPixels * numPixels]; -} - -// Read new values from movie -void movieEvent(Movie m) { - m.read(); - m.loadPixels(); - - for (int j = 0; j < numPixels; j++) { - for (int i = 0; i < numPixels; i++) { - myMovieColors[j*numPixels + i] = m.get(i, j); - } - } -} - -// Display values from movie -void draw() { - for (int j = 0; j < numPixels; j++) { - for (int i = 0; i < numPixels; i++) { - fill(myMovieColors[j*numPixels + i]); - rect(i*blockSize, j*blockSize, blockSize-1, blockSize-1); - } - } -} diff --git a/java/libraries/video/examples/RadialPocky/RadialPocky.pde b/java/libraries/video/examples/RadialPocky/RadialPocky.pde deleted file mode 100644 index 77d39c15c..000000000 --- a/java/libraries/video/examples/RadialPocky/RadialPocky.pde +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Radial Pocky - * by Ben Fry. - * - * Unwrap each frame of live video into a single line of pixels along a circle - */ - - -import processing.video.*; - -Capture video; -int videoCount; -int currentAngle; -int pixelCount; -int angleCount = 200; // how many divisions - -int radii[]; -int angles[]; - -void setup() { - // size must be set to video.width*video.height*2 in both directions - size(960, 540); - - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, 24, 16); - videoCount = video.width * video.height; - - pixelCount = width*height; - int centerX = width / 2; - int centerY = height / 2; - radii = new int[pixelCount]; - angles = new int[pixelCount]; - - int offset = 0; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - int dx = centerX - x; - int dy = centerY - y; - - float angle = atan2(dy, dx); - if (angle < 0) angle += TWO_PI; - angles[offset] = (int) (angleCount * (angle / TWO_PI)); - - int radius = (int) mag(dx, dy); - if (radius >= videoCount) { - radius = -1; - angles[offset] = -1; - } - radii[offset] = radius; - - offset++; - } - } - background(0); -} - - -void draw() { - if (video.available()) { - video.read(); - video.loadPixels(); - - loadPixels(); - for (int i = 0; i < pixelCount; i++) { - if (angles[i] == currentAngle) { - pixels[i] = video.pixels[radii[i]]; - } - } - updatePixels(); - - currentAngle++; - if (currentAngle == angleCount) currentAngle = 0; - } -} diff --git a/java/libraries/video/examples/SlitScan/SlitScan.pde b/java/libraries/video/examples/SlitScan/SlitScan.pde deleted file mode 100644 index 3e6dd7a44..000000000 --- a/java/libraries/video/examples/SlitScan/SlitScan.pde +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Simple Real-Time Slit-Scan Program. - * By Golan Levin. - * - * This demonstration depends on the canvas height being equal - * to the video capture height. If you would prefer otherwise, - * consider using the image copy() function rather than the - * direct pixel-accessing approach I have used here. - * - * Created December 2006. - * Updated June 2007 by fry. - */ -import processing.video.*; - -Capture video; - -int videoSliceX; -int drawPositionX; - - -void setup() { - size(600, 240, P2D); - - // Uses the default video input, see the reference if this causes an error - video = new Capture(this, 320, 240, 30); - - videoSliceX = video.width / 2; - drawPositionX = width - 1; - background(0); -} - - -void draw() { - if (video.available()) { - video.read(); - video.loadPixels(); - - // Copy a column of pixels from the middle of the video - // To a location moving slowly across the canvas. - loadPixels(); - for (int y = 0; y < video.height; y++){ - int setPixelIndex = y*width + drawPositionX; - int getPixelIndex = y*video.width + videoSliceX; - pixels[setPixelIndex] = video.pixels[getPixelIndex]; - } - updatePixels(); - - drawPositionX--; - // Wrap the position back to the beginning if necessary. - if (drawPositionX < 0) { - drawPositionX = width - 1; - } - } -} diff --git a/java/libraries/video/library/.cvsignore b/java/libraries/video/library/.cvsignore deleted file mode 100644 index beaeae295..000000000 --- a/java/libraries/video/library/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -video.jar \ No newline at end of file diff --git a/java/libraries/video/library/export.txt b/java/libraries/video/library/export.txt deleted file mode 100644 index 189254a96..000000000 --- a/java/libraries/video/library/export.txt +++ /dev/null @@ -1 +0,0 @@ -name = Video diff --git a/java/libraries/video/src/processing/video/Capture.java b/java/libraries/video/src/processing/video/Capture.java deleted file mode 100755 index a9a9a5696..000000000 --- a/java/libraries/video/src/processing/video/Capture.java +++ /dev/null @@ -1,549 +0,0 @@ -/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ - -/* - Part of the Processing project - http://processing.org - - Copyright (c) 2004-09 Ben Fry and Casey Reas - The previous version of this code was developed by Hernando Barragan - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General - Public License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA -*/ - -package processing.video; - -import processing.core.*; - -import java.lang.reflect.*; - -import quicktime.*; -import quicktime.qd.*; -import quicktime.std.*; -import quicktime.std.sg.*; -import quicktime.util.RawEncodedImage; - - -/** - * Watchin' shit on the telly. - */ -@SuppressWarnings("deprecation") -public class Capture extends PImage implements Runnable { - - // there are more, but these are all we'll provide for now - // The useful ref page for quicktime constants - static public final int COMPOSITE = StdQTConstants.compositeIn; // 0 - static public final int SVIDEO = StdQTConstants.sVideoIn; // 1 - static public final int COMPONENT = StdQTConstants.rgbComponentIn; // 2 - static public final int TUNER = StdQTConstants.tvTunerIn; // 6 - - static public final int NTSC = StdQTConstants.ntscIn; - static public final int PAL = StdQTConstants.palIn; - static public final int SECAM = StdQTConstants.secamIn; - - // no longer needed because parent field added to PImage - //PApplet parent; - - Method captureEventMethod; - String name; // keep track for error messages (unused) - Thread runner; - - boolean available = false; - - /** Temporary storage for the raw image - data read directly from the capture device */ - public int data[]; - - public int dataWidth; - public int dataHeight; - public int dataRowBytes; - - /** True if this image is currently being cropped */ - public boolean crop; - - public int cropX; - public int cropY; - public int cropW; - public int cropH; - - public int frameRate; - - public RawEncodedImage raw; - public SequenceGrabber capture; - - /** the guy who's doing all the work */ - public SGVideoChannel channel; - - /** boundary of image at the requested size */ - protected QDRect qdrect; - - /* - static { - try { - QTSession.open(); - } catch (QTException e) { - e.printStackTrace(); - } - // this doesn't appear to do jack - QTRuntimeException.registerHandler(new QTRuntimeHandler() { - public void exceptionOccurred(QTRuntimeException e, - Object obj, String s, boolean flag) { - System.err.println("Problem inside Capture"); - e.printStackTrace(); - } - }); - } - */ - - - public Capture(PApplet parent, int requestWidth, int requestHeight) { - this(parent, requestWidth, requestHeight, null, 30); - } - - public Capture(PApplet parent, int reqWidth, int reqHeight, int frameRate) { - this(parent, reqWidth, reqHeight, null, frameRate); - } - - public Capture(PApplet parent, int reqWidth, int reqHeight, String name) { - this(parent, reqWidth, reqHeight, name, 30); - } - - - /** - * If 'name' is null or the empty string, it won't set a specific - * device, which means that QuickTime will use that last device - * used by a QuickTime application. - *

- * Unfortunately, Apple's QuickTime API uses the name to select devices, - * and in some cases there might be cameras with the same name on a machine. - * If you ask for a camera of the same name in sequence, you might see if it - * just does the right thing and grabs each separate camera in succession. - * If that doesn't work, you might try calling settings() which will - * bring up the prompt where you can select a capture device. - *

- * If the following function: - *

public void captureEvent(Capture c)
- * is defined in the host PApplet, then it will be called every - * time a new frame is available from the capture device. - */ - public Capture(final PApplet parent, - final int requestWidth, final int requestHeight, - final String name, final int frameRate) { - // Running on EDT because of weird hang on OS X - // http://dev.processing.org/bugs/show_bug.cgi?id=882 - // QTSession.open() is hanging, not sure why, but it seems to prefer - // being run from the EDT. Not sure if that's a mistaken expectation in - // QTJava (we hadn't had trouble in the past because we did everything - // on the EDT) or if something broken in more recent QTJ. Or (maybe most - // likely) we're simply hitting some other threading strangeness, and - // using invokeLater() isolates us from that. Which is a nice way of - // saying that it's a hack. - //SwingUtilities.invokeLater(new Runnable() { - // public void run() { - init(parent, requestWidth, requestHeight, name, frameRate); - //} - //}); - } - - - public void init(PApplet parent, int requestWidth, int requestHeight, - String name, int frameRate) { - this.parent = parent; - this.name = name; - this.frameRate = frameRate; - - try { - QTSession.open(); - } catch (QTException e) { - e.printStackTrace(System.out); - return; - } - - try { - qdrect = new QDRect(requestWidth, requestHeight); - // workaround for bug with the intel macs - QDGraphics qdgraphics = null; //new QDGraphics(qdrect); - if (quicktime.util.EndianOrder.isNativeLittleEndian()) { - qdgraphics = new QDGraphics(QDConstants.k32BGRAPixelFormat, qdrect); - } else { - qdgraphics = new QDGraphics(QDGraphics.kDefaultPixelFormat, qdrect); - } - - capture = new SequenceGrabber(); - capture.setGWorld(qdgraphics, null); - - channel = new SGVideoChannel(capture); - channel.setBounds(qdrect); - channel.setUsage(2); // what is this usage number? - capture.startPreview(); // maybe this comes later? - - PixMap pixmap = qdgraphics.getPixMap(); - raw = pixmap.getPixelData(); - - /* - if (name == null) { - channel.settingsDialog(); - - } else if (name.length() > 0) { - channel.setDevice(name); - } - */ - if ((name != null) && (name.length() > 0)) { - channel.setDevice(name); - } - - dataRowBytes = raw.getRowBytes(); - dataWidth = dataRowBytes / 4; - dataHeight = raw.getSize() / dataRowBytes; - - if (dataWidth != requestWidth) { - crop = true; - cropX = 0; - cropY = 0; - cropW = requestWidth; - cropH = requestHeight; - } - // initialize my PImage self - super.init(requestWidth, requestHeight, RGB); - - parent.registerDispose(this); - - try { - captureEventMethod = - parent.getClass().getMethod("captureEvent", - new Class[] { Capture.class }); - } catch (Exception e) { - // no such method, or an error.. which is fine, just ignore - } - - runner = new Thread(this); - runner.start(); - - } catch (QTException qte) { - //} catch (StdQTException qte) { - //qte.printStackTrace(); - - int errorCode = qte.errorCode(); - if (errorCode == Errors.couldntGetRequiredComponent) { - // this can happen when the capture device isn't available - // or wasn't shut down properly - parent.die("No capture could be found, " + - "or the VDIG is not installed correctly.", qte); - } else { - parent.die("Error while setting up Capture", qte); - } - } catch (Exception e) { - parent.die("Error while setting up Capture", e); - } - } - - - /** - * True if a frame is ready to be read. - *
-   * // put this somewhere inside draw
-   * if (capture.available()) capture.read();
-   * 
- * Alternatively, you can use captureEvent(Capture c) to notify you - * whenever available() is set to true. In which case, things might - * look like this: - *
-   * public void captureEvent(Capture c) {
-   *   c.read();
-   *   // do something exciting now that c has been updated
-   * }
-   * 
- */ - public boolean available() { - return available; - } - - - /** - * Set the video to crop from its original. - *

- * It seems common that captures add lines to the top or bottom - * of an image, so this can be useful for removing them. - * Internally, the pixel buffer size returned from QuickTime is - * often a different size than requested, so crop will be set - * more often than not. - */ - public void crop(int x, int y, int w, int h) { - /* - if (imageMode == CORNERS) { - w -= x; // w was actually x2 - h -= y; // h was actually y2 - } - */ - - crop = true; - cropX = Math.max(0, x); - cropY = Math.max(0, y); - cropW = Math.min(w, dataWidth); - cropH = Math.min(dataHeight, y + h) - cropY; - - // if size has changed, re-init this image - if ((cropW != width) || (cropH != height)) { - init(w, h, RGB); - } - } - - - /** - * Remove the cropping (if any) of the image. - *

- * By default, cropping is often enabled to trim out black pixels. - * But if you'd rather deal with them yourself (so as to avoid - * an extra lag while the data is moved around) you can shut it off. - */ - public void noCrop() { - crop = false; - } - - - public void read() { - //try { - //synchronized (capture) { - loadPixels(); - synchronized (pixels) { - //System.out.println("read1"); - if (crop) { - //System.out.println("read2a"); - // f#$)(#$ing quicktime / jni is so g-d slow, calling copyToArray - // for the invidual rows is literally 100x slower. instead, first - // copy the entire buffer to a separate array (i didn't need that - // memory anyway), and do an arraycopy for each row. - if (data == null) { - data = new int[dataWidth * dataHeight]; - } - raw.copyToArray(0, data, 0, dataWidth * dataHeight); - int sourceOffset = cropX + cropY*dataWidth; - int destOffset = 0; - for (int y = 0; y < cropH; y++) { - System.arraycopy(data, sourceOffset, pixels, destOffset, cropW); - sourceOffset += dataWidth; - destOffset += width; - } - } else { // no crop, just copy directly - //System.out.println("read2b"); - raw.copyToArray(0, pixels, 0, width * height); - } - //System.out.println("read3"); - - available = false; - // mark this image as modified so that PGraphicsJava2D and - // PGraphicsOpenGL will properly re-blit and draw this guy - updatePixels(); - //System.out.println("read4"); - } - } - - - public void run() { - while ((Thread.currentThread() == runner) && (capture != null)) { - try { - synchronized (capture) { - capture.idle(); - //read(); - available = true; - - if (captureEventMethod != null) { - try { - captureEventMethod.invoke(parent, new Object[] { this }); - } catch (Exception e) { - System.err.println("Disabling captureEvent() for " + name + - " because of an error."); - e.printStackTrace(); - captureEventMethod = null; - } - } - } - - } catch (QTException e) { - errorMessage("run", e); - } - - try { - Thread.sleep(1000 / frameRate); - } catch (InterruptedException e) { } - } - } - - - /** - * Set the frameRate for how quickly new frames are read - * from the capture device. - */ - public void frameRate(int iframeRate) { - if (iframeRate <= 0) { - System.err.println("Capture: ignoring bad frameRate of " + - iframeRate + " fps."); - return; - } - frameRate = iframeRate; - } - - - /** - * Called by applets to stop capturing video. - */ - public void stop() { - if (capture != null) { - try { - capture.stop(); // stop the "preview" - } catch (StdQTException e) { - e.printStackTrace(); - } - capture = null; - } - runner = null; // unwind the thread - } - - - /** - * Called by PApplet to shut down video so that QuickTime - * can be used later by another applet. - */ - public void dispose() { - stop(); - //System.out.println("calling dispose"); - // this is important so that the next app can do video - QTSession.close(); - } - - - /** - * General error reporting, all corraled here just in case - * I think of something slightly more intelligent to do. - */ - protected void errorMessage(String where, Exception e) { - parent.die("Error inside Capture." + where + "()", e); - } - - - /** - * Set the format to ask for from the video digitizer: - * TUNER, COMPOSITE, SVIDEO, or COMPONENT. - *

- * The constants are just aliases to the constants returned from - * QuickTime's getInputFormat() function, so any valid constant from - * that will work just fine. - */ - public void source(int which) { - try { - VideoDigitizer digitizer = channel.getDigitizerComponent(); - int count = digitizer.getNumberOfInputs(); - for (int i = 0; i < count; i++) { - //System.out.println("format " + digitizer.getInputFormat(i)); - if (digitizer.getInputFormat(i) == which) { - digitizer.setInput(i); - return; - } - } - throw new RuntimeException("The specified source() is not available."); - - } catch (StdQTException e) { - e.printStackTrace(); - throw new RuntimeException("Could not set the video input source."); - } - } - - - /** - * Set the video format standard to use on the - * video digitizer: NTSC, PAL, or SECAM. - *

- * The constants are just aliases to the constants used for - * QuickTime's setInputStandard() function, so any valid - * constant from that will work just fine. - */ - public void format(int which) { - try { - VideoDigitizer digitizer = channel.getDigitizerComponent(); - digitizer.setInputStandard(which); - } catch (StdQTException e) { - e.printStackTrace(); - //throw new RuntimeException("Could not set the video input format"); - } - } - - - /** - * Show the settings dialog for this input device. - */ - public void settings() { - try { - // fix for crash here submitted by hansi (stop/startPreview lines) - capture.stop(); - - // Whenever settingsDialog() is called, the boundries change, - // causing the image to be cropped. Fix for Bug #366 - // http://dev.processing.org/bugs/show_bug.cgi?id=366 - channel.setBounds(qdrect); - - // Open the settings dialog (throws an Exception if canceled) - channel.settingsDialog(); - - } catch (StdQTException qte) { - int errorCode = qte.errorCode(); - if (errorCode == Errors.userCanceledErr) { - // User only canceled the settings dialog, continue as we were - } else { - qte.printStackTrace(); - throw new RuntimeException("Error inside Capture.settings()"); - } - } - try { - // Start the preview again (unreachable if newly thrown exception) - capture.startPreview(); - } catch (StdQTException qte) { - qte.printStackTrace(); - } - } - - - /** - * Get a list of all available captures as a String array. - * i.e. println(Capture.list()) will show you the goodies. - */ - static public String[] list() { - try { - QTSession.open(); - SequenceGrabber grabber = new SequenceGrabber(); - SGVideoChannel channel = new SGVideoChannel(grabber); - - SGDeviceList deviceList = channel.getDeviceList(0); // flags is 0 - String listing[] = new String[deviceList.getCount()]; - for (int i = 0; i < deviceList.getCount(); i++) { - listing[i] = deviceList.getDeviceName(i).getName(); - } - // properly shut down the channel so the app can use it again - grabber.disposeChannel(channel); - QTSession.close(); - return listing; - - } catch (QTException qte) { - int errorCode = qte.errorCode(); - if (errorCode == Errors.couldntGetRequiredComponent) { - throw new RuntimeException("Couldn't find any capture devices, " + - "read the video reference for more info."); - } else { - qte.printStackTrace(); - throw new RuntimeException("Problem listing capture devices, " + - "read the video reference for more info."); - } - } - //return null; - } -} diff --git a/java/libraries/video/src/processing/video/Movie.java b/java/libraries/video/src/processing/video/Movie.java deleted file mode 100644 index 276008233..000000000 --- a/java/libraries/video/src/processing/video/Movie.java +++ /dev/null @@ -1,735 +0,0 @@ -/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ - -/* - Part of the Processing project - http://processing.org - - Copyright (c) 2004-07 Ben Fry and Casey Reas - The previous version of this code was developed by Hernando Barragan - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General - Public License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA -*/ - -package processing.video; - -import processing.core.*; - -import java.io.*; -import java.lang.reflect.*; - -import quicktime.*; -import quicktime.io.QTFile; -import quicktime.qd.*; -import quicktime.std.*; -import quicktime.std.movies.media.DataRef; -import quicktime.util.QTHandle; -import quicktime.util.RawEncodedImage; - - -@SuppressWarnings("deprecation") -public class Movie extends PImage implements PConstants, Runnable { - Method movieEventMethod; - String filename; - Thread runner; - - PImage borderImage; - boolean removeBorders = true; - - boolean play; - boolean repeat; - boolean available; - int fps; - - /** - * The QuickTime for Java "Movie" object, made public - * in case anyone wants to play with it. - */ - public quicktime.std.movies.Movie movie; - - QDRect movieRect; - QDGraphics movieGraphics; - boolean firstFrame = true; - RawEncodedImage raw; - - - /* - static { - try { - //System.out.println("jlp = " + System.getProperty("java.library.path")); - QTSession.open(); - } catch (QTException e) { - e.printStackTrace(); - } - // shutting off for 0116, hoping for better exception handling - QTRuntimeException.registerHandler(new QTRuntimeHandler() { - public void exceptionOccurred(QTRuntimeException e, - Object obj, String s, boolean flag) { - System.err.println("Problem inside Movie"); - e.printStackTrace(); - } - }); - } - */ - - - public Movie(PApplet parent, String filename) { - this(parent, filename, 30); - } - - - public Movie(final PApplet parent, final String filename, final int ifps) { - // this creates a fake image so that the first time this - // attempts to draw, something happens that's not an exception - super(1, 1, RGB); - - // http://dev.processing.org/bugs/show_bug.cgi?id=882 - //SwingUtilities.invokeLater(new Runnable() { - //public void run() { - init(parent, filename, ifps); - //} - //}); - } - - - public void init(PApplet parent, String filename, int fps) { - this.parent = parent; - this.fps = fps; - - try { - QTSession.open(); - } catch (QTException e) { - e.printStackTrace(); - return; - } - - // first check to see if this can be read locally from a file. - // otherwise, will have to load the file into memory, which is - // gonna make people unhappy who are trying to play back 50 MB - // quicktime movies with a locally installed piece exported - // as an application. - try { - try { - // first try a local file using the dataPath. usually this will - // work ok, but sometimes the dataPath is inside a jar file, - // which is less fun, so this will crap out. - File file = new File(parent.dataPath(filename)); - if (file.exists()) { - movie = fromDataRef(new DataRef(new QTFile(file))); - //init(parent, movie, ifps); - //return; - } - } catch (Exception e) { } // ignored - - // read from a folder local to the current working dir - // called "data". presumably this might be the data folder, - // though that should be caught above, if such a folder exists. - /* - if (movie == null) { - try { - File file = new File("data", filename); - if (file.exists()) { - movie = fromDataRef(new DataRef(new QTFile(file))); - init(parent, movie, ifps); - return; - } - } catch (QTException e2) { } - } - */ - - // read from a file just hanging out in the local folder. - // this might happen when the video library is used with some - // other application, or the person enters a full path name - if (movie == null) { - try { - File file = new File(filename); - if (file.exists()) { - movie = fromDataRef(new DataRef(new QTFile(file))); - //init(parent, movie, ifps); - //return; - } - } catch (QTException e1) { } - } - - } catch (SecurityException se) { - // online, whups. catch the security exception out here rather than - // doing it three times (or whatever) for each of the cases above. - } - - // if the movie can't be read from a local file, it has to be read - // into a byte array and passed to qtjava. it's annoying that apple - // doesn't have something in the api to read a movie from a friggin - // InputStream, but oh well. it's their api. - if (movie == null) { - byte data[] = parent.loadBytes(filename); - //int dot = filename.lastIndexOf("."); - // grab the extension from the file, use mov if there is none - //String extension = (dot == -1) ? "mov" : - // filename.substring(dot + 1).toLowerCase(); - try { - movie = fromDataRef(new DataRef(new QTHandle(data))); - } catch (QTException e) { - e.printStackTrace(); - } - } - - /* - URL url = null; - this.filename = filename; // for error messages - - if (filename.startsWith("http://")) { - try { - url = new URL(filename); - DataRef urlRef = new DataRef(url.toExternalForm()); - movie = fromDataRef(urlRef); - init(parent, movie, ifps); - return; - - } catch (QTException qte) { - qte.printStackTrace(); - return; - - } catch (MalformedURLException e) { - e.printStackTrace(); - return; - } - } - - // updated for new loading style of 0096 - ClassLoader cl = parent.getClass().getClassLoader(); - url = cl.getResource("data/" + filename); - if (url != null) { - init(parent, url, ifps); - return; - } - - try { - try { - File file = new File(parent.dataPath(filename)); - if (file.exists()) { - movie = fromDataRef(new DataRef(new QTFile(file))); - init(parent, movie, ifps); - return; - } - } catch (Exception e) { } // ignored - - try { - File file = new File("data", filename); - if (file.exists()) { - movie = fromDataRef(new DataRef(new QTFile(file))); - init(parent, movie, ifps); - return; - } - } catch (QTException e2) { } - - try { - File file = new File(filename); - if (file.exists()) { - movie = fromDataRef(new DataRef(new QTFile(file))); - init(parent, movie, ifps); - return; - } - } catch (QTException e1) { } - - } catch (SecurityException se) { } // online, whups - */ - - if (movie == null) { - parent.die("Could not find movie file " + filename, null); - } - - // we've got a valid movie! let's rock. - try { - // this is probably causing the 2 seconds of audio - // disabled pre-preroll on 0126 because of security problems - //movie.prePreroll(0, 1.0f); - movie.preroll(0, 1.0f); - - // this has a possibility of running forever.. - // should probably happen on the thread as well. - while (movie.maxLoadedTimeInMovie() == 0) { - movie.task(100); - - // 0106: tried adding sleep time so this doesn't spin out of control - // works fine but doesn't really help anything - //try { - //Thread.sleep(5); - //} catch (InterruptedException e) { } - } - movie.setRate(1); - //fps = ifps; - - // register methods - parent.registerDispose(this); - - try { - movieEventMethod = - parent.getClass().getMethod("movieEvent", - new Class[] { Movie.class }); - } catch (Exception e) { - // no such method, or an error.. which is fine, just ignore - } - - // and now, make the magic happen - runner = new Thread(this); - runner.start(); - - } catch (QTException qte) { - qte.printStackTrace(); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - - /* - public Movie(PApplet parent, URL url) { - init(parent, url, 30); - } - - - public Movie(PApplet parent, URL url, int ifps) { - init(parent, url, ifps); - } - - - public void init(PApplet parent, URL url, int ifps) { - - String externalized = url.toExternalForm(); - System.out.println("externalized is " + externalized); - - // qtjava likes file: urls to read file:/// not file:/ - // so this changes them when appropriate - if (externalized.startsWith("file:/") && - !externalized.startsWith("file:///")) { - externalized = "file:///" + url.getPath(); - } - - // the url version is the only available that can take - // an InputStream (indirectly) since it uses url syntax - //DataRef urlRef = new DataRef(requestFile); - try { - System.out.println(url); - System.out.println(externalized); - DataRef urlRef = new DataRef(externalized); - System.out.println(urlRef); - - movie = fromDataRef(urlRef); - init(parent, movie, ifps); - - } catch (QTException e) { - e.printStackTrace(); - } - } - */ - - - /** - * Why does this function have to be so bizarre? i love the huge - * constants! i think they're neato. i feel like i'm coding for - * think pascal on my mac plus! those were happier times. - */ - private quicktime.std.movies.Movie fromDataRef(DataRef ref) - throws QTException { - - return - quicktime.std.movies.Movie.fromDataRef(ref, - StdQTConstants4.newMovieAsyncOK | - StdQTConstants.newMovieActive); - } - - - /* - public void init(PApplet parent, - quicktime.std.movies.Movie movie, int ifps) { - this.parent = parent; - - try { - // this is probably causing the 2 seconds of audio - movie.prePreroll(0, 1.0f); - movie.preroll(0, 1.0f); - - // this has a possibility of running forever.. - // should probably happen on the thread as well. - while (movie.maxLoadedTimeInMovie() == 0) { - movie.task(100); - - // 0106: tried adding sleep time so this doesn't spin out of control - // works fine but doesn't really help anything - //try { - //Thread.sleep(5); - //} catch (InterruptedException e) { } - } - movie.setRate(1); - fps = ifps; - - runner = new Thread(this); - runner.start(); - - - // register methods - - parent.registerDispose(this); - - try { - movieEventMethod = - parent.getClass().getMethod("movieEvent", - new Class[] { Movie.class }); - } catch (Exception e) { - // no such method, or an error.. which is fine, just ignore - } - - } catch (QTException qte) { - qte.printStackTrace(); - - } catch (Exception e) { - e.printStackTrace(); - } - } - */ - - - public boolean available() { - return available; - } - - - public void read() { - try { - if (firstFrame) { - movieRect = movie.getBox(); - //movieGraphics = new QDGraphics(movieRect); - if (quicktime.util.EndianOrder.isNativeLittleEndian()) { - movieGraphics = - new QDGraphics(QDConstants.k32BGRAPixelFormat, movieRect); - } else { - movieGraphics = - new QDGraphics(QDGraphics.kDefaultPixelFormat, movieRect); - } - } - - Pict pict = movie.getPict(movie.getTime()); // returns an int - pict.draw(movieGraphics, movieRect); - PixMap pixmap = movieGraphics.getPixMap(); - raw = pixmap.getPixelData(); - - // It needs to get at least a small part - // of the video to get the parameters - if (firstFrame) { - //int intsPerRow = pixmap.getRowBytes() / 4; - int movieWidth = movieRect.getWidth(); - int movieHeight = movieRect.getHeight(); - int j = raw.getRowBytes() - movieWidth*4; - // this doesn't round up.. does it need to? - int k = j / 4; - int dataWidth = movieWidth + k; - - if (dataWidth != movieWidth) { - if (removeBorders) { - borderImage = new PImage(dataWidth, movieHeight, RGB); - } else { - movieWidth = dataWidth; - } - } - //int vpixels[] = new int[movieWidth * movieHeight]; - //image = new PImage(vpixels, movieWidth, movieHeight, RGB); - super.init(movieWidth, movieHeight, RGB); - //parent.video = image; - firstFrame = false; - } - // this happens later (found by hernando) - //raw.copyToArray(0, image.pixels, 0, image.width * image.height); - - loadPixels(); - // this is identical to a chunk of code inside PCamera - // this might be a candidate to move up to PVideo or something - if (borderImage != null) { // need to remove borders - raw.copyToArray(0, borderImage.pixels, - 0, borderImage.width * borderImage.height); - int borderIndex = 0; - int targetIndex = 0; - for (int i = 0; i < height; i++) { - System.arraycopy(borderImage.pixels, borderIndex, - pixels, targetIndex, width); - borderIndex += borderImage.width; - targetIndex += width; - } - } else { // just copy directly - raw.copyToArray(0, pixels, 0, width * height); - } - - // ready to rock - //System.out.println("updating pixels"); - //updatePixels(); // mark as modified - updatePixels(); - - } catch (QTException qte) { - qte.printStackTrace(); - //QTSession.close(); // let dispose() handle it - } - } - - - /** - * Begin playing the movie, with no repeat. - */ - public void play() { -// if (runner != null) { -// stop(); -// } - play = true; -// runner = new Thread(this); -// runner.start(); - } - - - /** - * Begin playing the movie, with repeat. - */ - public void loop() { - play(); - repeat = true; - } - - - /** - * Shut off the repeating loop. - */ - public void noLoop() { - repeat = false; - } - - - /** - * Pause the movie at its current time. - */ - public void pause() { - play = false; - //System.out.println("pause"); - } - - - /** - * Stop the movie, and rewind. - */ - public void stop() { - play = false; -// runner = null; - - try { - movie.setTimeValue(0); - - } catch (StdQTException e) { - errorMessage("stop", e); - } - } - - - /** - * Set how often new frames are to be read from the movie. - * Does not actually set the speed of the movie playback, - * that's handled by the speed() method. - */ - public void frameRate(int ifps) { - if (ifps <= 0) { - System.err.println("Movie: ignoring bad frame rate of " + - ifps + " fps."); - } else { - fps = ifps; - } - } - - - /** - * Set a multiplier for how fast/slow the movie should be run. - * The default is 1.0. - *

    - *
  • speed(2) will play the movie at double speed (2x). - *
  • speed(0.5) will play at half speed. - *
  • speed(-1) will play backwards at regular speed. - *
- */ - public void speed(float rate) { - //rate = irate; - try { - movie.setRate(rate); - - } catch (StdQTException e) { - errorMessage("speed", e); - } - } - - - /** - * Return the current time in seconds. - * The number is a float so fractions of seconds can be used. - */ - public float time() { - try { - return (float)movie.getTime() / (float)movie.getTimeScale(); - - } catch (StdQTException e) { - errorMessage("time", e); - } - return -1; - } - - - /** - * Jump to a specific location (in seconds). - * The number is a float so fractions of seconds can be used. - */ - public void jump(float where) { - try { - //movie.setTime(new TimeRecord(rate, where)); // scale, value - //movie.setTime(new TimeRecord(1, where)); // scale, value - int scaledTime = (int) (where * movie.getTimeScale()); - movie.setTimeValue(scaledTime); - - } catch (StdQTException e) { - errorMessage("jump", e); - } - } - - - /** - * Get the full length of this movie (in seconds). - */ - public float duration() { - try { - return (float)movie.getDuration() / (float)movie.getTimeScale(); - - } catch (StdQTException e) { - errorMessage("length", e); - } - return -1; - } - - - /* - public void play() { - if(!play) { - play = true; - } - start(); - while( image == null) { - try { - Thread.sleep(5); - } catch (InterruptedException e) { } - } - pixels = image.pixels; - width = image.width; - height = image.height; - } - - - public void repeat() { - loop = true; - if(!play) { - play = true; - } - start(); - while( image == null) { - try { - Thread.sleep(5); - } catch (InterruptedException e) { } - } - pixels = image.pixels; - width = image.width; - height = image.height; - } - - - public void pause() { - play = false; - } - */ - - - public void run() { - //System.out.println("entering thread"); - while (Thread.currentThread() == runner) { - //System.out.print("<"); - try { - //Thread.sleep(5); - Thread.sleep(1000 / fps); - } catch (InterruptedException e) { } - //System.out.print(">"); - - // this could be a lie, but.. - if (play) { - //read(); - //System.out.println("play"); - available = true; - - if (movieEventMethod == null) { - // If no special handling, then automatically read from the movie. - read(); - - } else { - try { - movieEventMethod.invoke(parent, new Object[] { this }); - } catch (Exception e) { - System.err.println("error, disabling movieEvent() for " + - filename); - e.printStackTrace(); - movieEventMethod = null; - } - } - - try { - if (movie.isDone() && repeat) { - movie.goToBeginning(); - } - } catch (StdQTException e) { - play = false; - errorMessage("rewinding", e); - } - //} else { - //System.out.println("no play"); - } - - //try { - //read(); - //if (movie.isDone() && loop) movie.goToBeginning(); - - //} catch (QTException e) { - //System.err.println("Movie exception"); - //e.printStackTrace(); - //QTSession.close(); ?? - //} - } - } - - - /** - * Call this to halt the movie from running, and stop its thread. - */ - public void dispose() { - stop(); - runner = null; - QTSession.close(); - } - - - /** - * General error reporting, all corraled here just in case - * I think of something slightly more intelligent to do. - */ - protected void errorMessage(String where, Exception e) { - parent.die("Error inside Movie." + where + "()", e); - } -} - diff --git a/java/libraries/video/src/processing/video/MovieMaker.java b/java/libraries/video/src/processing/video/MovieMaker.java deleted file mode 100644 index b63944792..000000000 --- a/java/libraries/video/src/processing/video/MovieMaker.java +++ /dev/null @@ -1,335 +0,0 @@ -/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ - -/* - Part of the Processing project - http://processing.org - - Copyright (c) 2006 Daniel Shiffman - With minor modifications by Ben Fry for Processing 0125+ - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General - Public License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA -*/ - -package processing.video; - -import java.io.File; - -import quicktime.*; -import quicktime.io.*; -import quicktime.qd.*; -import quicktime.std.*; -import quicktime.std.image.*; -import quicktime.std.movies.Movie; -import quicktime.std.movies.Track; -import quicktime.std.movies.media.VideoMedia; -import quicktime.util.*; - -import processing.core.*; - - -/** - * Library to create a QuickTime movie from a Processing pixel array. - * Written by Daniel Shiffman. - * Thanks to Dan O'Sullivan and Shawn Van Every. - *

- * Please note that some constructors and variable names were altered - * slightly when the library was added to the Processing distribution. - *
- * // Declare MovieMaker object
- * MovieMaker mm;
- *
- * void setup() {
- *   size(320, 240);
- *
- *   // Create MovieMaker object with size, filename,
- *   // compression codec and quality, framerate
- *   mm = new MovieMaker(this, width, height, "drawing.mov", 30,
- *                       MovieMaker.H263, MovieMaker.HIGH);
- *   background(160, 32, 32);
- * }
- *
- * void draw() {
- *   stroke(7, 146, 168);
- *   strokeWeight(4);
- *
- *   // Draw if mouse is pressed
- *   if (mousePressed) {
- *     line(pmouseX, pmouseY, mouseX, mouseY);
- *   }
- *
- *   // Add window's pixels to movie
- *   mm.addFrame();
- * }
- *
- * void keyPressed() {
- *   // Finish the movie if space bar is pressed!
- *   if (key == ' ') {
- *     mm.finish();
- *   }
- * }
- * 
- */ -@SuppressWarnings("deprecation") -public class MovieMaker { - public static final int RAW = StdQTConstants.kRawCodecType; - public static final int ANIMATION = StdQTConstants.kAnimationCodecType; - public static final int BASE = StdQTConstants.kBaseCodecType; - public static final int BMP = StdQTConstants.kBMPCodecType; - public static final int CINEPAK = StdQTConstants.kCinepakCodecType; - public static final int COMPONENT = StdQTConstants.kComponentVideoCodecType; - public static final int CMYK = StdQTConstants.kCMYKCodecType; - public static final int GIF = StdQTConstants.kGIFCodecType; - public static final int GRAPHICS = StdQTConstants.kGraphicsCodecType; - public static final int H261 = StdQTConstants.kH261CodecType; - public static final int H263 = StdQTConstants.kH263CodecType; - // H.264 encoding, added because no constant is available in QTJava - public static final int H264 = QTUtils.toOSType("avc1"); - public static final int JPEG = StdQTConstants.kJPEGCodecType; - public static final int MS_VIDEO = StdQTConstants.kMicrosoftVideo1CodecType; - public static final int MOTION_JPEG_A = StdQTConstants.kMotionJPEGACodecType; - public static final int MOTION_JPEG_B = StdQTConstants.kMotionJPEGBCodecType; - public static final int SORENSON = StdQTConstants.kSorensonCodecType; - public static final int VIDEO = StdQTConstants.kVideoCodecType; - - public static final int WORST = StdQTConstants.codecMinQuality; - public static final int LOW = StdQTConstants.codecLowQuality; - public static final int MEDIUM = StdQTConstants.codecNormalQuality; - public static final int HIGH = StdQTConstants.codecHighQuality; - public static final int BEST = StdQTConstants.codecMaxQuality; - public static final int LOSSLESS = StdQTConstants.codecLosslessQuality; - - private int width; - private int height; - - private boolean readyForFrames; - - // Changed from 1000 to 600 in release 0154 to enable exact 30 fps output. - // http://dev.processing.org/bugs/show_bug.cgi?id=988 - private int TIME_SCALE = 600; - - // QT Stuff - private VideoMedia videoMedia; - private Track videoTrack; - private Movie movie; - private QTFile movFile; - private CSequence seq; - private QTHandle imageHandle; - private QDGraphics gw; - private QDRect bounds; - private ImageDescription imgDesc; - private RawEncodedImage compressedImage; - - private int rate; - private int keyFrameRate = 15; - private int codecType, codecQuality; - - // my hack to make sure we don't get error -8691 - private boolean temporalSupported = true; - - private PApplet parent; - - - /** - * Create a movie with the specified width, height, and filename. - * The movie will be created at 15 frames per second. - * The codec will be set to RAW and quality set to HIGH. - */ - public MovieMaker(PApplet p, int _w, int _h, String _filename) { - this(p, _w, _h, _filename, 30, RAW, HIGH, 15); - } - - - /** - * Create a movie with the specified width, height, filename, and frame rate. - * The codec will be set to RAW and quality set to HIGH. - */ - public MovieMaker(PApplet p, int _w, int _h, String _filename, int _rate) { - this(p, _w, _h, _filename, _rate, RAW, HIGH, 15); - } - - - /** - * Create a movie with the specified width, height, filename, frame rate, - * and codec type and quality. Key frames will be set at 15 frames. - */ - public MovieMaker(PApplet p, int _w, int _h, String _filename, int _rate, - int _codecType, int _codecQuality) { - this(p, _w, _h, _filename, _rate, _codecType, _codecQuality, 15); - } - - - /** - * Create a movie with the specified width, height, filename, frame rate, - * codec type and quality, and key frame rate. - */ - public MovieMaker(PApplet p, int _w, int _h, String _filename, int _rate, - int _codecType, int _codecQuality, - int _keyFrameRate) { - parent = p; - - width = _w; - height = _h; - rate = _rate; - - try { - QTSession.open(); - } catch (QTException e1) { - e1.printStackTrace(); - } - - try { - ImageDescription imgD = null; - if (quicktime.util.EndianOrder.isNativeLittleEndian()) { - imgD = new ImageDescription(QDConstants.k32BGRAPixelFormat); - } else { - imgD = new ImageDescription(QDGraphics.kDefaultPixelFormat); - } - imgD.setWidth(width); - imgD.setHeight(height); - gw = new QDGraphics(imgD, 0); - - } catch (QTException e) { - e.printStackTrace(); - } - codecType = _codecType; - codecQuality = _codecQuality; - keyFrameRate = _keyFrameRate; - initMovie(_filename); - - parent.registerDispose(this); - } - - - private void initMovie(String filename) { - try { - String path = parent.savePath(filename); - movFile = new QTFile(new File(path)); - movie = Movie.createMovieFile(movFile, StdQTConstants.kMoviePlayer, StdQTConstants.createMovieFileDeleteCurFile); - int timeScale = TIME_SCALE; // 100 units per second - videoTrack = movie.addTrack(width, height, 0); - videoMedia = new VideoMedia(videoTrack, timeScale); - videoMedia.beginEdits(); - bounds = new QDRect(0, 0, width, height); - int rawImageSize = QTImage.getMaxCompressionSize(gw, bounds, gw.getPixMap().getPixelSize(), codecQuality, codecType, CodecComponent.anyCodec); - imageHandle = new QTHandle(rawImageSize, true); - imageHandle.lock(); - compressedImage = RawEncodedImage.fromQTHandle(imageHandle); - seq = new CSequence(gw, bounds, gw.getPixMap().getPixelSize(), codecType, CodecComponent.bestFidelityCodec, codecQuality, codecQuality, keyFrameRate, null, 0); - imgDesc = seq.getDescription(); - readyForFrames = true; - - } catch (QTException e) { - if (e.errorCode() == Errors.noCodecErr) { - if (imageHandle == null) { - // This means QTImage.getMaxCompressionSize() failed - System.err.println("The specified codec is not supported, " + - "please ensure that the parameters are valid, " + - "and in the correct order."); - } else { - // If it's a -8961 error, quietly do it the other way - // (this happens when RAW is specified) - temporalSupported = false; - readyForFrames = true; - } - - } else if (e.errorCode() == Errors.fBsyErr) { - System.err.println("The movie file already exists. " + - "Please delete it first."); - - } else { - e.printStackTrace(); - } - } - } - - - // A simple add function to just add whatever is in the parent window - public void addFrame() { - // http://dev.processing.org/bugs/show_bug.cgi?id=692 - parent.flush(); - parent.loadPixels(); - addFrame(parent.pixels, parent.width, parent.height); - } - - - public void addFrame(int[] _pixels, int w, int h) { - if (readyForFrames){ - RawEncodedImage pixelData = gw.getPixMap().getPixelData(); - int rowBytes = pixelData.getRowBytes() / 4; - int[] newpixels = new int[rowBytes*h]; - for (int i = 0; i < rowBytes; i++) { - for (int j = 0; j < h; j++) { - if (i < w) { - newpixels[i+j*rowBytes] = _pixels[i+j*w]; - } else { - newpixels[i+j*rowBytes] = 0; - } - } - } - pixelData.setInts(0,newpixels); - compressAndAdd(); - } - } - - - private void compressAndAdd() { - try { - if (temporalSupported) { - CompressedFrameInfo cfInfo = seq.compressFrame(gw, bounds, StdQTConstants.codecFlagUpdatePrevious, compressedImage); - boolean syncSample = cfInfo.getSimilarity() == 0; // see developer.apple.com/qa/qtmcc/qtmcc20.html - videoMedia.addSample(imageHandle, 0, cfInfo.getDataSize(), TIME_SCALE/rate, imgDesc, 1, syncSample ? 0 : StdQTConstants.mediaSampleNotSync); - } else { - imgDesc = QTImage.fCompress(gw,gw.getBounds(),32,codecQuality,codecType, CodecComponent.anyCodec, null, 0, RawEncodedImage.fromQTHandle(imageHandle)); - boolean syncSample = true; // UM, what the hell should this be??? - videoMedia.addSample(imageHandle, 0, imgDesc.getDataSize(), TIME_SCALE/rate, imgDesc, 1, syncSample ? 0 : StdQTConstants.mediaSampleNotSync); - } - } catch (QTException e) { - e.printStackTrace(); - } - } - - - /** - * Close out and finish the movie file. - */ - public void finish() { - try { - if (readyForFrames) { - //System.out.println("Finishing movie file."); - readyForFrames = false; - videoMedia.endEdits(); - videoTrack.insertMedia(0, 0, videoMedia.getDuration(), 1); - OpenMovieFile omf = OpenMovieFile.asWrite(movFile); - movie.addResource(omf, StdQTConstants.movieInDataForkResID, - movFile.getName()); - } - } catch (StdQTException se) { - se.printStackTrace(); - } catch (QTException qe) { - qe.printStackTrace(); - } - } - - - public void dispose() { - if (readyForFrames) finish(); - - try { - QTSession.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } -}