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 0d624969b..000000000
Binary files a/java/libraries/video/examples/AsciiVideo/data/UniversLTStd-Light-48.vlw and /dev/null differ
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();
- }
- }
-}