From a3f9cff1a68e264f250871f3f7141b2cbbd791a4 Mon Sep 17 00:00:00 2001 From: Mani Monajjemi Date: Mon, 21 Oct 2013 11:07:21 -0700 Subject: [PATCH] Upgrading to Parrot SDK 2.0.1 --- ARDroneLib/FFMPEG/Makefile | 2 +- .../FFMPEG/parrot_ffmpeg_build_utils.tar.gz | Bin 8529 -> 10062 bytes ARDroneLib/Soft/Build/config.makefile | 16 +- ARDroneLib/Soft/Build/custom.makefile | 2 +- ARDroneLib/Soft/Common/academy_common.h | 2 +- ARDroneLib/Soft/Common/ardrone_api.h | 16 - ARDroneLib/Soft/Common/autoconf.h | 51 - ARDroneLib/Soft/Common/config.h | 1 - ARDroneLib/Soft/Common/config_keys.h | 4 - ARDroneLib/Soft/Common/control_states.h | 2 +- ARDroneLib/Soft/Common/navdata_common.h | 7 +- ARDroneLib/Soft/Common/navdata_keys.h | 8 +- ARDroneLib/Soft/Lib/Build/Makefile | 6 +- ARDroneLib/Soft/Lib/Maths/matrices.c | 9 +- ARDroneLib/Soft/Lib/Maths/matrix3d.c | 2 +- .../Lib/ardrone_tool/AT/ardrone_at_mutex.c | 29 +- .../Soft/Lib/ardrone_tool/Academy/academy.c | 8 +- .../Soft/Lib/ardrone_tool/Academy/academy.h | 21 +- .../ardrone_tool/Academy/academy_download.c | 579 ++--- .../Academy/academy_stage_recorder.c | 26 +- .../Lib/ardrone_tool/Academy/academy_upload.c | 12 +- .../ardrone_tool/Control/ardrone_control.c | 397 ++- .../Navdata/ardrone_academy_navdata.c | 590 ++--- .../Navdata/ardrone_general_navdata.c | 29 +- .../Navdata/ardrone_navdata_client.h | 20 +- .../Soft/Lib/ardrone_tool/Navdata/navdata.c | 5 + .../Lib/ardrone_tool/Video/video_com_stage.c | 48 +- .../Video/video_recorder_pipeline.c | 2 +- .../Soft/Lib/ardrone_tool/Video/video_stage.c | 7 + .../ardrone_tool/Video/video_stage_decoder.c | 397 +-- .../ardrone_tool/Video/video_stage_decoder.h | 17 +- .../Video/video_stage_encoded_recorder.c | 487 ++-- .../Video/video_stage_encoded_recorder.h | 2 +- .../Video/video_stage_ffmpeg_decoder.c | 17 +- .../Video/video_stage_ittiam_decoder.c | 4 + .../Lib/ardrone_tool/Video/video_stage_tcp.c | 3 + .../ardrone_tool/Video/vlib_stage_decode.c | 1 + .../Soft/Lib/ardrone_tool/ardrone_tool.c | 8 +- .../Soft/Lib/ardrone_tool/ardrone_tool.h | 2 +- .../ardrone_tool/ardrone_tool_configuration.c | 8 + .../Soft/Lib/ardrone_tool/ardrone_version.c | 8 + .../Soft/Lib/ardrone_tool/ardrone_version.h | 2 + ARDroneLib/Soft/Lib/utils/ardrone_ftp.c | 2256 +++++++++-------- ARDroneLib/Soft/Lib/utils/ardrone_ftp.h | 1 + ARDroneLib/Soft/Lib/utils/ardrone_time.c | 78 +- ARDroneLib/Soft/Lib/utils/ardrone_time.h | 3 + .../Soft/Lib/utils/ardrone_video_atoms.c | 639 ++--- .../Soft/Lib/utils/ardrone_video_atoms.h | 1 + .../Soft/Lib/utils/ardrone_video_encapsuler.c | 97 +- .../Soft/Lib/utils/ardrone_video_encapsuler.h | 87 +- ARDroneLib/VLIB/P263/p263_codec.c | 2 + ARDroneLib/VLIB/P264/p264_codec.c | 27 +- .../Platform/arm9/UVLC/uvlc_mb_layer_p5p.S | 7 - .../VLIB/Platform/arm9/video_quantizer_p5p.S | 6 - ARDroneLib/VLIB/UVLC/uvlc_codec.c | 2 +- ARDroneLib/VLIB/video_codec.c | 4 +- ARDroneLib/VLIB/video_controller.c | 1 + ARDroneLib/VLIB/video_huffman.c | 1 + ARDroneLib/VP_SDK/ATcodec/ATcodec_api.c | 16 +- ARDroneLib/VP_SDK/Build/Makefile | 5 +- ARDroneLib/VP_SDK/Build/do.sh | 87 +- ARDroneLib/VP_SDK/VP_Os/elinux/vp_os_signal.c | 1 - ARDroneLib/VP_SDK/VP_Os/linux/vp_os_signal.c | 4 +- ARDroneLib/VP_SDK/VP_Os/vp_os_print.h | 18 +- .../VP_SDK/VP_Stages/vp_stages_frame_pipe.c | 4 +- .../VP_SDK/VP_Stages/vp_stages_io_buffer.c | 5 +- .../VP_SDK/VP_Stages/vp_stages_io_file.c | 24 +- ARDroneLib/VP_SDK/VP_Stages/vp_stages_o_sdl.c | 5 +- 68 files changed, 3072 insertions(+), 3166 deletions(-) delete mode 100644 ARDroneLib/Soft/Common/autoconf.h diff --git a/ARDroneLib/FFMPEG/Makefile b/ARDroneLib/FFMPEG/Makefile index 9f625a0..0b96558 100644 --- a/ARDroneLib/FFMPEG/Makefile +++ b/ARDroneLib/FFMPEG/Makefile @@ -13,7 +13,7 @@ else RELEASE_OPT="debug" endif -FFMPEG_CONFIG=decoder +FFMPEG_CONFIG=both FFMPEG_DIR_EXIST=$(shell bash -c "if [ -d ffmpeg ]; then echo \"YES\"; else echo \"NO\"; fi") diff --git a/ARDroneLib/FFMPEG/parrot_ffmpeg_build_utils.tar.gz b/ARDroneLib/FFMPEG/parrot_ffmpeg_build_utils.tar.gz index bc86883e45675a2eef2329f141734696160a80fb..521f7b18d0b303b006634ba2372eb13af7b83fc2 100644 GIT binary patch literal 10062 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 literal 8529 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 L=NHff0C)fZ2D^$( diff --git a/ARDroneLib/Soft/Build/config.makefile b/ARDroneLib/Soft/Build/config.makefile index 7490828..eb257e2 100644 --- a/ARDroneLib/Soft/Build/config.makefile +++ b/ARDroneLib/Soft/Build/config.makefile @@ -65,10 +65,10 @@ ifdef PC_TARGET OS_DEFINE=GNU_LINUX else ifeq ("$(USE_LINUX)","yes") - OS_DEFINE=GNU_LINUX - else - TARGET:=$(TARGET).exe - OS_DEFINE=WINDOW + OS_DEFINE=GNU_LINUX + else + TARGET:=$(TARGET).exe + OS_DEFINE=WINDOW endif endif @@ -110,8 +110,8 @@ ifdef PC_TARGET ifeq ("$(IPHONE_MODE)","yes") SDK_FLAGS+="USE_IPHONE=yes" - SDK_FLAGS+="FFMPEG_SUPPORT=no" - SDK_FLAGS+="ITTIAM_SUPPORT=yes" + SDK_FLAGS+="FFMPEG_SUPPORT=yes" + SDK_FLAGS+="ITTIAM_SUPPORT=no" SDK_FLAGS+="USE_VIDEO_TCP=yes" SDK_FLAGS+="USE_VIDEO_HD=no" else @@ -127,10 +127,10 @@ ifdef PC_TARGET ifeq ("$(USE_ANDROID)","yes") SDK_FLAGS+="USE_ANDROID=yes" - SDK_FLAGS+="TOOLCHAIN_VERSION=arm-linux-androideabi-4.4.3" + SDK_FLAGS+="TOOLCHAIN_VERSION=arm-linux-androideabi-4.6" SDK_FLAGS+="NDK_PLATFORM_VERSION=android-8" SDK_FLAGS+="FFMPEG_SUPPORT=yes" - SDK_FLAGS+="ITTIAM_SUPPORT=yes" + SDK_FLAGS+="ITTIAM_SUPPORT=no" SDK_FLAGS+="USE_VIDEO_TCP=yes" SDK_FLAGS+="USE_VIDEO_HD=no" else diff --git a/ARDroneLib/Soft/Build/custom.makefile b/ARDroneLib/Soft/Build/custom.makefile index 053d94d..e2f2b25 100644 --- a/ARDroneLib/Soft/Build/custom.makefile +++ b/ARDroneLib/Soft/Build/custom.makefile @@ -14,7 +14,7 @@ ifndef USE_ANDROID USE_ANDROID = no endif ifndef USE_LINUX -USE_LINUX = yes +USE_LINUX = no endif ifndef PROJECT # set default to ardrone2 for video TCP com. diff --git a/ARDroneLib/Soft/Common/academy_common.h b/ARDroneLib/Soft/Common/academy_common.h index 8ac409d..353621c 100644 --- a/ARDroneLib/Soft/Common/academy_common.h +++ b/ARDroneLib/Soft/Common/academy_common.h @@ -44,6 +44,6 @@ typedef struct _academy_user_t_ } academy_user_t; typedef void (*academy_callback)(academy_state_t state); -typedef void (*academy_download_new_media)(const char *mediaPath); +typedef void (*academy_download_new_media)(const char *mediaPath, bool_t addToQueue); #endif // _ACADEMY_COMMON_H_ diff --git a/ARDroneLib/Soft/Common/ardrone_api.h b/ARDroneLib/Soft/Common/ardrone_api.h index aeecf51..a0d1a41 100644 --- a/ARDroneLib/Soft/Common/ardrone_api.h +++ b/ARDroneLib/Soft/Common/ardrone_api.h @@ -359,22 +359,6 @@ typedef enum FLYING_MODE_HOVER_ON_TOP_OF_ORIENTED_ROUNDEL = 1 << 1, /**< Commands are disabled, drones hovers on top of an oriented roundel - oriented roundel detection MUST be activated by the user with 'detect_type' configuration. */ } FLYING_MODE; -/* - * @enum TRAVELLING_MODE - * @brief Values for the CONTROL:travelling_mode configuration. - */ -typedef enum -{ - TRAVELLING_MODE_TRANSLATION = 0, /**< Travelling translation mode */ - TRAVELLING_MODE_CIRCULAR, /**< Travelling circular mode */ - TRAVELLING_MODE_SWING, /**/ - TRAVELLING_MODE_WHEEL_FRONT, /**/ - TRAVELLING_MODE_WHEEL_SIDE, /**/ - TRAVELLING_MODE_GUSH, /**/ - TRAVELLING_MODE_PLANAR_WHEEL,/**/ - TRAVELLING_MODE_NUM, -} TRAVELLING_MODE; - /** * @enum WIFI_MODE * @brief Values for the NETWORK:wifi_mode configuration, who set the wifi mode when drone start diff --git a/ARDroneLib/Soft/Common/autoconf.h b/ARDroneLib/Soft/Common/autoconf.h deleted file mode 100644 index da7ddb5..0000000 --- a/ARDroneLib/Soft/Common/autoconf.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Automatically generated C config: don't edit - * Linux kernel version: - * Thu Nov 5 18:06:01 2009 - */ -#define AUTOCONF_INCLUDED -#define PAL_TRACE_THREAD_VAL 0 -#define PAL_ASSERT 1 -#define MODIF_VERSION_NUMBER 0 -#define PAL_BUTTON_LONG_PRESS_TIME 2000 -#define PAL_BUTTON_DRIVER 1 -#define PAL_I2C_DRIVER 1 -#define MAJOR_VERSION_NUMBER 1 -#define PAL_TRACE_SEM_VAL 0 -#define MINOR_VERSION_NUMBER 0 -#define PAL_TRACE_SYS_VAL 0 -#define PAL_SUP_NB_TIMERS 18 -#define PAL_TRACE_HWALARM_VAL 0 -#define PAL_PWM_DRIVER 1 -#define PAL_I2C_DEVICES 1 -#define EXTENDED_VERSION_INFO RC0 -#define PAL_SUP_NB_MOD 32 -#define PAL_TRACE_FLAG_VAL 0 -#define PAL_TRACE_COND_VAL 0 -#define PAL_DEBUG_LEVEL 1 -#define PAL_TRACE_GPIO_VAL 0 -#define PAL_TRACE_TIME_VAL 0 -#define PAL_TRACE_MBOX_VAL 0 -#define PAL_TRACE_UART_VAL 0 -#define PAL_GPIO_DRIVER 1 -#define PAL_P6MU_ADC_DEVICE 1 -#define PAL_P6MU_CODEC_DEVICE 1 -#define BUILD_PAL 1 -#define PAL_SUP_PRIO_P1 18 -#define PAL_SUP_PRIO_P2 20 -#define PAL_SUP_PRIO_P3 22 -#define PAL_SUP_PRIO_P4 24 -#define PAL_SUP_PRIO_P5 26 -#define PAL_UARTS_COUNT 4 -#define PAL_LINUX_NOSMP 1 -#define PAL_TRACE_ALARM_VAL 0 -#define PAL_SUP_MAX_MES 60 -#define CONFIG_PAL_USER_ASSERT 1 -#define TRUC_POURRI_YMM 1 -#define UNAME_RELEASE 2.6.28-16-generic -#define PAL_BUTTON_MAX_HW_DRIVERS 1 -#define PAL_TRACE_MUTEX_VAL 0 -#define PAL_BUTTON_MAX_BUTTONS 32 -#define PAL_STACKSIZE 6144 -#define PAL_POSIX_MIX_PRIO 1 -#define PAL_POSIX_RT_PRIO_THRESHOLD 10 diff --git a/ARDroneLib/Soft/Common/config.h b/ARDroneLib/Soft/Common/config.h index 404e7fa..ba83536 100644 --- a/ARDroneLib/Soft/Common/config.h +++ b/ARDroneLib/Soft/Common/config.h @@ -14,7 +14,6 @@ #include #else #include - #include #endif #undef ARDRONE_PIC_VERSION diff --git a/ARDroneLib/Soft/Common/config_keys.h b/ARDroneLib/Soft/Common/config_keys.h index be366ad..d38bf17 100644 --- a/ARDroneLib/Soft/Common/config_keys.h +++ b/ARDroneLib/Soft/Common/config_keys.h @@ -157,8 +157,6 @@ extern const float32_t default_magneto_radius; #define ARDRONE_DEFAULT_DATE "19700101_000000" #define ARDRONE_EMPTY_STRING "" -#define ARDRONE_DEFAULT_TRAVELLING_MODE "0,10,1500,0,1000" - #define CUSTOM_CONFIGURATION_DELETE_ALL_CMD "all" @@ -283,8 +281,6 @@ ARDRONE_CONFIG_KEY_IMM_a10("control", outdoor_control_yaw, INI_FLOAT, ARDRONE_CONFIG_KEY_IMM_a10("control", flying_mode, INI_INT, int32_t, int32_t*, (K_READ|K_WRITE|K_NOBIND|K_SHALLOW), (K_READ|K_WRITE), 0, flying_mode_config_callback,CAT_SESSION) ARDRONE_CONFIG_KEY_IMM_a10("control", hovering_range, INI_INT, int32_t, int32_t*, (K_READ|K_WRITE|K_NOBIND|K_SHALLOW), (K_READ|K_WRITE), 1000, default_config_callback, CAT_SESSION) ARDRONE_CONFIG_KEY_STR_a10("control", flight_anim, INI_STRING, string_t, char*, (K_READ|K_WRITE|K_NOBIND|K_SHALLOW), 0, "0,0", flight_animation_selection_callback,CAT_COMMON) -ARDRONE_CONFIG_KEY_STR_a10("control", travelling_mode, INI_STRING, string_t, char*, (K_READ|K_WRITE), (K_READ|K_WRITE), ARDRONE_DEFAULT_TRAVELLING_MODE, travelling_mode_selection_callback,CAT_USER) -ARDRONE_CONFIG_KEY_IMM_a10("control", travelling_enable, INI_BOOLEAN, bool_t, bool_t*, (K_READ|K_WRITE|K_NOBIND|K_SHALLOW), 0, FALSE, travelling_enable_callback, CAT_COMMON) ARDRONE_CONFIG_KEY_STR_a10("network", ssid_single_player, INI_STRING, string_t, char*, (K_READ|K_WRITE), 0, WIFI_NETWORK_NAME, default_config_callback, CAT_COMMON) ARDRONE_CONFIG_KEY_STR_a10("network", ssid_multi_player, INI_STRING, string_t, char*, (K_READ|K_WRITE), 0, WIFI_NETWORK_NAME, default_config_callback, CAT_COMMON) diff --git a/ARDroneLib/Soft/Common/control_states.h b/ARDroneLib/Soft/Common/control_states.h index b7f24f1..20860e5 100644 --- a/ARDroneLib/Soft/Common/control_states.h +++ b/ARDroneLib/Soft/Common/control_states.h @@ -72,7 +72,7 @@ typedef enum { CVAR( FLYING_ALT_OUT_ZONE ), CVAR( FLYING_COMBINED_YAW ), CVAR( FLYING_BRAKE ), - CVAR( FLYING_NO_VISION ) + CVAR( FLYING_NO_VISION ), #ifndef CTRL_STATES_STRING } FLYING_STATES; #else diff --git a/ARDroneLib/Soft/Common/navdata_common.h b/ARDroneLib/Soft/Common/navdata_common.h index e4c67a1..b858593 100644 --- a/ARDroneLib/Soft/Common/navdata_common.h +++ b/ARDroneLib/Soft/Common/navdata_common.h @@ -210,7 +210,7 @@ static const int32_t MAYDAY_TIMEOUT[ARDRONE_NB_ANIM_MAYDAY] = { #define NAVDATA_HEADER 0x55667788 -#define NAVDATA_MAX_SIZE 2048 +#define NAVDATA_MAX_SIZE 4096 #define NAVDATA_MAX_CUSTOM_TIME_SAVE 20 /* !!! Warning !!! - changing the value below would break compatibility with older applications @@ -355,7 +355,6 @@ typedef struct _navdata_raw_measures_t { uint16_t nb_echo; uint32_t sum_echo; int32_t alt_temp_raw; - int16_t gradient; }_ATTRIBUTE_PACKED_ navdata_raw_measures_t; @@ -395,8 +394,8 @@ typedef struct _navdata_wind_speed_t { uint16_t tag; uint16_t size; - float32_t wind_speed; - float32_t wind_angle; + float32_t wind_speed; // estimated wind speed [m/s] + float32_t wind_angle; // estimated wind direction in North-East frame [rad] e.g. if wind_angle is pi/4, wind is from South-West to North-East float32_t wind_compensation_theta; float32_t wind_compensation_phi; float32_t state_x1; diff --git a/ARDroneLib/Soft/Common/navdata_keys.h b/ARDroneLib/Soft/Common/navdata_keys.h index fdc941d..049567e 100644 --- a/ARDroneLib/Soft/Common/navdata_keys.h +++ b/ARDroneLib/Soft/Common/navdata_keys.h @@ -31,10 +31,10 @@ NAVDATA_OPTION( navdata_watchdog_t , navdata_watchdog , NAVDATA_WATC NAVDATA_OPTION( navdata_adc_data_frame_t, navdata_adc_data_frame , NAVDATA_ADC_DATA_FRAME_TAG ) NAVDATA_OPTION( navdata_video_stream_t, navdata_video_stream , NAVDATA_VIDEO_STREAM_TAG ) NAVDATA_OPTION( navdata_games_t, navdata_games , NAVDATA_GAMES_TAG ) -NAVDATA_OPTION( navdata_pressure_raw_t, navdata_pressure_raw , NAVDATA_PRESSURE_RAW_TAG ) -NAVDATA_OPTION( navdata_magneto_t, navdata_magneto , NAVDATA_MAGNETO_TAG ) -NAVDATA_OPTION( navdata_wind_speed_t, navdata_wind_speed , NAVDATA_WIND_TAG ) -NAVDATA_OPTION( navdata_kalman_pressure_t,navdata_kalman_pressure , NAVDATA_KALMAN_PRESSURE_TAG ) +NAVDATA_OPTION( navdata_pressure_raw_t, navdata_pressure_raw , NAVDATA_PRESSURE_RAW_TAG ) +NAVDATA_OPTION( navdata_magneto_t, navdata_magneto , NAVDATA_MAGNETO_TAG ) +NAVDATA_OPTION( navdata_wind_speed_t, navdata_wind_speed , NAVDATA_WIND_TAG ) +NAVDATA_OPTION( navdata_kalman_pressure_t,navdata_kalman_pressure , NAVDATA_KALMAN_PRESSURE_TAG ) NAVDATA_OPTION( navdata_hdvideo_stream_t ,navdata_hdvideo_stream , NAVDATA_HDVIDEO_STREAM_TAG ) NAVDATA_OPTION( navdata_wifi_t ,navdata_wifi , NAVDATA_WIFI_TAG ) diff --git a/ARDroneLib/Soft/Lib/Build/Makefile b/ARDroneLib/Soft/Lib/Build/Makefile index 29c6365..5a6dcf3 100644 --- a/ARDroneLib/Soft/Lib/Build/Makefile +++ b/ARDroneLib/Soft/Lib/Build/Makefile @@ -77,6 +77,10 @@ GENERIC_LIBRARY_SOURCE_FILES+= \ $(ARDRONE_TOOL_DIR)/Video/video_stage_decoder.c \ $(ARDRONE_TOOL_DIR)/Video/video_recorder_pipeline.c \ $(ARDRONE_TOOL_DIR)/Video/video_stage.c + ifeq ($(USE_ANDROID),yes) + GENERIC_LIBRARY_SOURCE_FILES+= \ + $(UTILS_DIR)/AR_Ftw.c + endif endif ifneq ($(CONTROL_DLL),yes) @@ -165,7 +169,7 @@ export GENERIC_BINARIES_SOURCE_ENTRYPOINTS= all $(MAKECMDGOALS): @if [ '$(MAKECMDGOALS)' != 'clean' ]; then echo "$(OK_COLOR)Building ARDroneTool/Lib$(NO_COLOR)"; fi @$(MAKE) -C ../../../VP_SDK/Build $(TMP_SDK_FLAGS) $(SDK_FLAGS) $(MAKECMDGOALS) - + makefileverbose: @echo "Dump compilation flags:" @echo "GENERIC_CFLAGS : $(GENERIC_CFLAGS)" diff --git a/ARDroneLib/Soft/Lib/Maths/matrices.c b/ARDroneLib/Soft/Lib/Maths/matrices.c index 447fb50..9671add 100644 --- a/ARDroneLib/Soft/Lib/Maths/matrices.c +++ b/ARDroneLib/Soft/Lib/Maths/matrices.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -223,12 +224,12 @@ bool_t normalize_vec( vector31_t* v ) void display_matrix33(matrix33_t *m1) { - printf("( %f\t%f\t%f )\n( %f\t%f\t%f )\n( %f\t%f\t%f )\n",m1->m11,m1->m12,m1->m13,m1->m21,m1->m22,m1->m23,m1->m31,m1->m32,m1->m33); + PRINT("( %f\t%f\t%f )\n( %f\t%f\t%f )\n( %f\t%f\t%f )\n",m1->m11,m1->m12,m1->m13,m1->m21,m1->m22,m1->m23,m1->m31,m1->m32,m1->m33); } void display_vector31(vector31_t *v1) { - printf("( %f\t%f\t%f )\n", v1->x ,v1->y, v1->z); + PRINT("( %f\t%f\t%f )\n", v1->x ,v1->y, v1->z); } // matrix of size 4 @@ -408,12 +409,12 @@ void inv_mat44(matrix44_t *out, matrix44_t* m1) void display_matrix44(matrix44_t *m1) { - printf("( %f\t%f\t%f\t%f )\n( %f\t%f\t%f\t%f )\n( %f\t%f\t%f\t%f )\n( %f\t%f\t%f\t%f )\n",m1->m11,m1->m12,m1->m13,m1->m14,m1->m21,m1->m22,m1->m23,m1->m24,m1->m31,m1->m32,m1->m33,m1->m34,m1->m41,m1->m42,m1->m43,m1->m44); + PRINT("( %f\t%f\t%f\t%f )\n( %f\t%f\t%f\t%f )\n( %f\t%f\t%f\t%f )\n( %f\t%f\t%f\t%f )\n",m1->m11,m1->m12,m1->m13,m1->m14,m1->m21,m1->m22,m1->m23,m1->m24,m1->m31,m1->m32,m1->m33,m1->m34,m1->m41,m1->m42,m1->m43,m1->m44); } void display_vector41(vector41_t *v1) { - printf("( %f\t%f\t%f\t%f )\n", v1->x1 ,v1->x2, v1->x3, v1->x4); + PRINT("( %f\t%f\t%f\t%f )\n", v1->x1 ,v1->x2, v1->x3, v1->x4); } diff --git a/ARDroneLib/Soft/Lib/Maths/matrix3d.c b/ARDroneLib/Soft/Lib/Maths/matrix3d.c index 00b05a1..94a15e8 100644 --- a/ARDroneLib/Soft/Lib/Maths/matrix3d.c +++ b/ARDroneLib/Soft/Lib/Maths/matrix3d.c @@ -146,7 +146,7 @@ C_RESULT matrix3d_orientation(matrix3d_t* m, const vector31_t* pos, const vector return C_OK; } -#define MATRIX_EXCHANGE( out, in ) temp = out; out = in; in = out +#define MATRIX_EXCHANGE( out, in ) temp = out; out = in; in = temp C_RESULT matrix3d_transpose(matrix3d_t* out, matrix3d_t* in) { diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/AT/ardrone_at_mutex.c b/ARDroneLib/Soft/Lib/ardrone_tool/AT/ardrone_at_mutex.c index 497b2d1..67bfdfc 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/AT/ardrone_at_mutex.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/AT/ardrone_at_mutex.c @@ -20,6 +20,7 @@ #include #include #include +#include //Common #include @@ -160,16 +161,27 @@ AT_CODEC_ERROR_CODE host_open( void ) PRINT ("Error setting SND_BUF for AT socket\n"); } - int opt = IPTOS_PREC_NETCONTROL; - int res = setsockopt((int)at_socket.priv, IPPROTO_IP, IP_TOS, &opt, (socklen_t)sizeof(opt)); - if (res) +/* + * On android, with IP_TOS set, certain devices can't connect to AR.Drone 1 + * So we just disable this functionnality to avoid these cases. + */ +#ifdef USE_ANDROID + if (IS_ARDRONE2) { - perror("AT stage - setting Live video socket IP Type Of Service : "); - } - else - { - printf ("Set IP_TOS ok\n"); +#endif + int opt = IPTOS_PREC_NETCONTROL; + int res = setsockopt((int)at_socket.priv, IPPROTO_IP, IP_TOS, &opt, (socklen_t)sizeof(opt)); + if (res) + { + perror("AT stage - setting Live video socket IP Type Of Service : "); + } + else + { + printf ("Set IP_TOS ok\n"); + } +#ifdef USE_ANDROID } +#endif @@ -306,6 +318,7 @@ void ardrone_at_set_flat_trim(void) { if (!at_init) return; + vp_os_mutex_lock(&at_mutex); ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_FTRIM_EXE, ++nb_sequence ); diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy.c b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy.c index 3682d27..9105508 100755 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy.c @@ -219,7 +219,7 @@ DEFINE_THREAD_ROUTINE(academy, data) academy.flight_sum = 0; academy.flight_oldest_date[0] = '\0'; - if(!ftw(flight_dir, &academy_compute_memory_used, 1)) + if(!ftw(flight_dir, &academy_compute_memory_used, ACADEMY_MAX_FD_FOR_FTW)) { if(academy.flight_sum > MBYTE_TO_BYTE(academy.flight_max_storing_size)) { @@ -229,17 +229,21 @@ DEFINE_THREAD_ROUTINE(academy, data) // remove oldest flight PA_WARNING("Too much memory used %d MB > %d MB, removing oldest flight %s...", BYTE_TO_MBYTE(academy.flight_sum), academy.flight_max_storing_size, remove_dir); - if(!ftw(remove_dir, &academy_remove, 1)) + if(!ftw(remove_dir, &academy_remove, ACADEMY_MAX_FD_FOR_FTW)) { rmdir(remove_dir); PA_WARNING("OK.\n"); } } else + { needToCheckMemory = FALSE; + } } else + { needToCheckMemory = FALSE; + } } } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy.h b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy.h index 3003941..2ed229c 100755 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy.h +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy.h @@ -17,11 +17,17 @@ #include #include #include +#include #include #include #include #include +#ifndef USE_ANDROID #include +#else +#include +#endif + #include #ifndef _WIN32 @@ -40,6 +46,7 @@ #define ACADEMY_MAX_LIST 1024 #define ACADEMY_MAX_LINE 128 #define ACADEMY_MAX_FILENAME 256 +#define ACADEMY_MAX_FD_FOR_FTW 20 #define PA_PREFIX "PA : " @@ -47,26 +54,26 @@ #define PA_DEBUG(...) \ do \ { \ - printf (PA_PREFIX); \ - printf (__VA_ARGS__); \ + PRINT (PA_PREFIX); \ + PRINT (__VA_ARGS__); \ } while (0) #define PA_WARNING(...) \ do \ { \ -printf (PA_PREFIX); \ -printf (__VA_ARGS__); \ +PRINT (PA_PREFIX); \ +PRINT (__VA_ARGS__); \ } while (0) #else #define PA_DEBUG(...) #define PA_WARNING(...) \ do \ { \ -printf (PA_PREFIX); \ -printf (__VA_ARGS__); \ +PRINT (PA_PREFIX); \ +PRINT (__VA_ARGS__); \ } while (0) #endif -#define ACADEMY_SERVERNAME "" +#define ACADEMY_SERVERNAME "parrot01.nyx.emencia.net" #define ACADEMY_PORT 21 #define BYTE_TO_MBYTE(a) (a / 1048576) #define MBYTE_TO_BYTE(a) (a * 1048576) diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_download.c b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_download.c index 04732cc..717c6b8 100755 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_download.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_download.c @@ -12,8 +12,8 @@ typedef struct _academy_download_t_ { academy_callback callback; - academy_download_new_media new_media_callback; - academy_state_t state; + academy_download_new_media new_media_callback; + academy_state_t state; } academy_download_t; PROTO_THREAD_ROUTINE(academy_download, data); @@ -27,120 +27,120 @@ static vp_os_cond_t academy_download_cond; static void academy_download_private_callback(academy_state_t state) { static char msg[DISPLAY_STRING_LENGTH] = { 0 }; - switch(state.result) - { - case ACADEMY_RESULT_NONE: - switch(state.state) - { - case ACADEMY_STATE_CONNECTION: - snprintf (msg, DISPLAY_STRING_LENGTH, "Connecting to %s...", &wifi_ardrone_ip[0]); - break; + switch(state.result) + { + case ACADEMY_RESULT_NONE: + switch(state.state) + { + case ACADEMY_STATE_CONNECTION: + snprintf (msg, DISPLAY_STRING_LENGTH, "Connecting to %s...", &wifi_ardrone_ip[0]); + break; - case ACADEMY_STATE_PREPARE_PROCESS: - snprintf (msg, DISPLAY_STRING_LENGTH, "Preparing download from %s to local directory...", &wifi_ardrone_ip[0]); - break; + case ACADEMY_STATE_PREPARE_PROCESS: + snprintf (msg, DISPLAY_STRING_LENGTH, "Preparing download from %s to local directory...", &wifi_ardrone_ip[0]); + break; - case ACADEMY_STATE_PROCESS: - snprintf (msg, DISPLAY_STRING_LENGTH, "Downloading from %s to local directory...", &wifi_ardrone_ip[0]); - break; + case ACADEMY_STATE_PROCESS: + snprintf (msg, DISPLAY_STRING_LENGTH, "Downloading from %s to local directory...", &wifi_ardrone_ip[0]); + break; - case ACADEMY_STATE_FINISH_PROCESS: - snprintf (msg, DISPLAY_STRING_LENGTH, "Finishing download from %s to local directory...", &wifi_ardrone_ip[0]); - break; + case ACADEMY_STATE_FINISH_PROCESS: + snprintf (msg, DISPLAY_STRING_LENGTH, "Finishing download from %s to local directory...", &wifi_ardrone_ip[0]); + break; - case ACADEMY_STATE_DISCONNECTION: - snprintf (msg, DISPLAY_STRING_LENGTH, "Disconnection to %s...", &wifi_ardrone_ip[0]); - break; + case ACADEMY_STATE_DISCONNECTION: + snprintf (msg, DISPLAY_STRING_LENGTH, "Disconnection to %s...", &wifi_ardrone_ip[0]); + break; - case ACADEMY_STATE_NONE: - strncpy(msg, "", DISPLAY_STRING_LENGTH); - break; + case ACADEMY_STATE_NONE: + strncpy(msg, "", DISPLAY_STRING_LENGTH); + break; - default: - strncpy(msg, "", DISPLAY_STRING_LENGTH); - break; - } - break; + default: + strncpy(msg, "", DISPLAY_STRING_LENGTH); + break; + } + break; - case ACADEMY_RESULT_OK: - strncat(msg, "OK", DISPLAY_STRING_LENGTH - strlen (msg)); - break; + case ACADEMY_RESULT_OK: + strncat(msg, "OK", DISPLAY_STRING_LENGTH - strlen (msg)); + break; - case ACADEMY_RESULT_FAILED: - strncat(msg, "FAILED", DISPLAY_STRING_LENGTH - strlen (msg)); - break; - } - - if(strlen(msg) != 0) - PA_DEBUG("===========> %s\n", msg); + case ACADEMY_RESULT_FAILED: + strncat(msg, "FAILED", DISPLAY_STRING_LENGTH - strlen (msg)); + break; + } + + if(strlen(msg) != 0) + PA_DEBUG("===========> %s\n", msg); } static void academy_download_resetState(academy_download_t *academy) { - academy_resetState(&academy->state); - if(academy->callback) - academy->callback(academy->state); + academy_resetState(&academy->state); + if(academy->callback) + academy->callback(academy->state); } static void academy_download_nextState(academy_download_t *academy) { - academy_nextState(&academy->state); - if(academy->callback) - academy->callback(academy->state); + academy_nextState(&academy->state); + if(academy->callback) + academy->callback(academy->state); } static void academy_download_stateOK(academy_download_t *academy) { - academy_stateOK(&academy->state); - if(academy->callback) - academy->callback(academy->state); + academy_stateOK(&academy->state); + if(academy->callback) + academy->callback(academy->state); } static void academy_download_stateERROR(academy_download_t *academy) { - academy_stateERROR(&academy->state); - if(academy->callback) - academy->callback(academy->state); - academy_download_resetState(academy); + academy_stateERROR(&academy->state); + if(academy->callback) + academy->callback(academy->state); + academy_download_resetState(academy); } void academy_download_init(academy_download_new_media academy_download_callback_func) { - if(!academy_download_started) - { + if(!academy_download_started) + { vp_os_mutex_init (&academy_download_mutex); vp_os_cond_init (&academy_download_cond, &academy_download_mutex); - academy_download_started = TRUE; - vp_os_thread_create(thread_academy_download, (THREAD_PARAMS)academy_download_callback_func, &academy_download_thread); - } + academy_download_started = TRUE; + vp_os_thread_create(thread_academy_download, (THREAD_PARAMS)academy_download_callback_func, &academy_download_thread); + } } void academy_download_shutdown(void) { - if(academy_download_started) - { - academy_download_started = FALSE; + if(academy_download_started) + { + academy_download_started = FALSE; academy_download_resume (); - vp_os_thread_join(academy_download_thread); - } + vp_os_thread_join(academy_download_thread); + } } DEFINE_THREAD_ROUTINE(academy_download, data) { - char *directoryList = NULL; + char *directoryList = NULL; bool_t shouldGoInPause = FALSE; - char *fileList = NULL; - char process_dirname[ACADEMY_MAX_FILENAME]; - _ftp_t *academy_ftp = NULL; - _ftp_status academy_status; - struct stat statbuf; - char *ptr = NULL; - academy_download_t academy; - + char *fileList = NULL; + char process_dirname[ACADEMY_MAX_FILENAME]; + _ftp_t *academy_ftp = NULL; + _ftp_status academy_status; + struct stat statbuf; + char *ptr = NULL; + academy_download_t academy; + academy.new_media_callback = (academy_download_new_media)data; academy.callback = academy_download_private_callback; - - printf("Start thread %s \n", __FUNCTION__); + + PRINT("Start thread %s \n", __FUNCTION__); do { academy_download_resetState(&academy); @@ -148,257 +148,264 @@ DEFINE_THREAD_ROUTINE(academy_download, data) if (TRUE == academy_download_in_pause) { vp_os_mutex_lock (&academy_download_mutex); - printf ("Academy download stage paused\n"); + PRINT ("Academy download stage paused\n"); vp_os_cond_wait (&academy_download_cond); vp_os_mutex_unlock (&academy_download_mutex); } academy_download_pause(); - printf ("Academy download stage resumed\n"); + PRINT ("Academy download stage resumed\n"); academy_download_nextState(&academy); - - while( academy_download_started && !shouldGoInPause) - { - academy_status = FTP_FAIL; - switch(academy.state.state) + while( academy_download_started && !shouldGoInPause) + { + academy_status = FTP_FAIL; + + switch(academy.state.state) { - case ACADEMY_STATE_NONE: + case ACADEMY_STATE_NONE: + academy_status = FTP_SUCCESS; + break; + + case ACADEMY_STATE_CONNECTION: + if(academy_ftp == NULL) + academy_ftp = ftpConnect(&wifi_ardrone_ip[0], ACADEMY_PORT, "anonymous", "", &academy_status); + + if(academy_ftp != NULL) academy_status = FTP_SUCCESS; - break; - - case ACADEMY_STATE_CONNECTION: - if(academy_ftp == NULL) - academy_ftp = ftpConnect(&wifi_ardrone_ip[0], ACADEMY_PORT, "anonymous", "", &academy_status); + break; - if(academy_ftp != NULL) - academy_status = FTP_SUCCESS; - break; + case ACADEMY_STATE_PREPARE_PROCESS: + academy_status = ftpCd(academy_ftp, "/boxes"); + if(FTP_SUCCEDED(academy_status)) + { + char *next_dir = NULL; + PA_DEBUG("Enter to boxes directory\n"); + academy_status = ftpList(academy_ftp, &directoryList, NULL); - case ACADEMY_STATE_PREPARE_PROCESS: - academy_status = ftpCd(academy_ftp, "/boxes"); - if(FTP_SUCCEDED(academy_status)) - { - char *next_dir = NULL; - PA_DEBUG("Enter to boxes directory\n"); - academy_status = ftpList(academy_ftp, &directoryList, NULL); + // If directory is empty, we consider that it is an error + if(academy_status == FTP_SAMESIZE) + academy_status = FTP_FAIL; - // If directory is empty, we consider that it is an error - if(academy_status == FTP_SAMESIZE) - academy_status = FTP_FAIL; - - if(FTP_SUCCEDED(academy_status)) - { - char local_dir[ACADEMY_MAX_FILENAME]; - // Search if it stay ftpremove_* directories to continue removing - PA_DEBUG("Get directory list :\n%s", directoryList); - while(FTP_SUCCEDED(academy_status) && (ptr = academy_get_next_item_with_prefix(directoryList, &next_dir, "ftpremove_downloading_", TRUE))) - { - char remove_dirname[ACADEMY_MAX_FILENAME]; + if(FTP_SUCCEDED(academy_status)) + { + char local_dir[ACADEMY_MAX_FILENAME]; + // Search if it stay ftpremove_* directories to continue removing + PA_DEBUG("Get directory list :\n%s", directoryList); + while(FTP_SUCCEDED(academy_status) && (ptr = academy_get_next_item_with_prefix(directoryList, &next_dir, "ftpremove_downloading_", TRUE))) + { + char remove_dirname[ACADEMY_MAX_FILENAME]; strncpy(remove_dirname, ptr, ACADEMY_MAX_FILENAME); - academy_status = academy_remove_ftp_directory(academy_ftp, remove_dirname); - } + academy_status = academy_remove_ftp_directory(academy_ftp, remove_dirname); + } - academy_status = FTP_FAIL; - next_dir = NULL; - // Search if it stay downloading_flight_* file to continue downloading. - ptr = academy_get_next_item_with_prefix(directoryList, &next_dir, "downloading_flight_", TRUE); - // Check if transfer was in progress - if(ptr != NULL) - { - // Transfer was in progress - PA_DEBUG("Transfer was in progress\n"); - strncpy(process_dirname, ptr, ACADEMY_MAX_FILENAME); - snprintf(local_dir, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname); - if((stat(local_dir, &statbuf) == 0) && S_ISDIR(statbuf.st_mode)) - { - // Transfer was in progress by current device - PA_DEBUG("Transfer was in progress by current device\n"); - academy_status = FTP_SUCCESS; - } - else - { - // Transfer was in progress by an other device => Create local directory - PA_DEBUG("Transfer was in progress by an other device\n"); - printf("Creating local directory %s\n", local_dir); - if(mkdir(local_dir, 0777) >= 0) - { - PA_DEBUG("Create local directory %s\n", local_dir); - academy_status = FTP_SUCCESS; - } - } - } - else - { - PA_DEBUG(" Transfer was not in progress\n"); - // Transfer was not in progress => Get oldest flight, rename remote directory and create local directory - next_dir = NULL; - ptr = academy_get_next_item_with_prefix(directoryList, &next_dir, "flight_", TRUE); - if(ptr != NULL) - { - // Prepare to process new transfer - PA_DEBUG("Prepare to process new transfer\n"); - snprintf(process_dirname, ACADEMY_MAX_FILENAME, "downloading_%s", ptr); - academy_status = ftpRename(academy_ftp, ptr, process_dirname); - if(FTP_SUCCEDED(academy_status)) - { - PA_DEBUG("Rename %s to %s directory\n", ptr, process_dirname); + academy_status = FTP_FAIL; + next_dir = NULL; + // Search if it stay downloading_flight_* file to continue downloading. + ptr = academy_get_next_item_with_prefix(directoryList, &next_dir, "downloading_flight_", TRUE); + // Check if transfer was in progress + if(ptr != NULL) + { + // Transfer was in progress + PA_DEBUG("Transfer was in progress\n"); + strncpy(process_dirname, ptr, ACADEMY_MAX_FILENAME); + snprintf(local_dir, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname); + if((stat(local_dir, &statbuf) == 0) && S_ISDIR(statbuf.st_mode)) + { + // Transfer was in progress by current device + PA_DEBUG("Transfer was in progress by current device\n"); + academy_status = FTP_SUCCESS; + } + else + { + // Transfer was in progress by an other device => Create local directory + PA_DEBUG("Transfer was in progress by an other device\n"); + PRINT("Creating local directory %s\n", local_dir); + if(mkdir(local_dir, 0777) >= 0) + { + PA_DEBUG("Create local directory %s\n", local_dir); + academy_status = FTP_SUCCESS; + } + } + } + else + { + PA_DEBUG(" Transfer was not in progress\n"); + // Transfer was not in progress => Get oldest flight, rename remote directory and create local directory + next_dir = NULL; + ptr = academy_get_next_item_with_prefix(directoryList, &next_dir, "flight_", TRUE); + if(ptr != NULL) + { + // Prepare to process new transfer + PA_DEBUG("Prepare to process new transfer\n"); + snprintf(process_dirname, ACADEMY_MAX_FILENAME, "downloading_%s", ptr); + academy_status = ftpRename(academy_ftp, ptr, process_dirname); + if(FTP_SUCCEDED(academy_status)) + { + PA_DEBUG("Rename %s to %s directory\n", ptr, process_dirname); snprintf(local_dir, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname); - if((stat(local_dir, &statbuf) != 0) && (mkdir(local_dir, 0777) >= 0)) - PA_DEBUG("Create local directory %s if not exist\n", local_dir); - academy_status = FTP_SUCCESS; - } - } - else - { - shouldGoInPause = TRUE; + if((stat(local_dir, &statbuf) != 0) && (mkdir(local_dir, 0777) >= 0)) + PA_DEBUG("Create local directory %s if not exist\n", local_dir); + academy_status = FTP_SUCCESS; } - } + } + else + { + shouldGoInPause = TRUE; + } + } - if(directoryList != NULL) - { - vp_os_free(directoryList); - directoryList = NULL; - } - } - } - break; + if(directoryList != NULL) + { + vp_os_free(directoryList); + directoryList = NULL; + } + } + } + break; - case ACADEMY_STATE_PROCESS: - academy_status = ftpCd(academy_ftp, process_dirname); - if(FTP_SUCCEDED(academy_status)) - { - PA_DEBUG("Enter to %s directory\n", process_dirname); - academy_status = ftpList(academy_ftp, &fileList, NULL); - if(FTP_SUCCEDED(academy_status)) - { - char *next_file = NULL; - char media_dirname[ACADEMY_MAX_FILENAME]; - char local_filename[ACADEMY_MAX_FILENAME]; - bool_t userbox_ready = FALSE; + case ACADEMY_STATE_PROCESS: + academy_status = ftpCd(academy_ftp, process_dirname); + if(FTP_SUCCEDED(academy_status)) + { + PA_DEBUG("Enter to %s directory\n", process_dirname); + academy_status = ftpList(academy_ftp, &fileList, NULL); + if(FTP_SUCCEDED(academy_status)) + { + char *next_file = NULL; + char media_dirname[ACADEMY_MAX_FILENAME]; + char local_filename[ACADEMY_MAX_FILENAME]; + bool_t userbox_ready = FALSE; - PA_DEBUG("Get file list :\n%s", fileList); - ptr = academy_get_next_item_with_prefix(fileList, &next_file, "userbox_", FALSE); - if(ptr != NULL) - { - snprintf(local_filename, ACADEMY_MAX_FILENAME, "%s/%s/%s", flight_dir, process_dirname, ptr); - PA_DEBUG("Get %s from drone to local directory...", local_filename); - academy_status = ftpGet (academy_ftp, ptr, local_filename, 1, NULL); - if(FTP_SUCCEDED(academy_status)) - { - userbox_ready = TRUE; - PA_DEBUG("OK\n"); - } - else - PA_DEBUG("ERROR\n"); - } + PA_DEBUG("Get file list :\n%s", fileList); + ptr = academy_get_next_item_with_prefix(fileList, &next_file, "userbox_", FALSE); + if(ptr != NULL) + { + snprintf(local_filename, ACADEMY_MAX_FILENAME, "%s/%s/%s", flight_dir, process_dirname, ptr); + PA_DEBUG("Get %s from drone to local directory...", local_filename); + academy_status = ftpGet (academy_ftp, ptr, local_filename, 1, NULL); + if(FTP_SUCCEDED(academy_status)) + { + userbox_ready = TRUE; + PA_DEBUG("OK\n"); + } + else + PA_DEBUG("ERROR\n"); + } - snprintf(media_dirname, ACADEMY_MAX_FILENAME, "%s/media_%s", flight_dir, process_dirname + (strlen("downloading_flight_"))); - //printf("medias directory : %s\n", media_dirname); - next_file = NULL; - while(FTP_SUCCEDED(academy_status) && (ptr = academy_get_next_item_with_prefix(fileList, &next_file, "picture_", FALSE))) - { - if((stat(media_dirname, &statbuf) != 0) && (mkdir(media_dirname, 0777) >= 0)) - PA_DEBUG("Create local media directory %s if not exist\n", media_dirname); + snprintf(media_dirname, ACADEMY_MAX_FILENAME, "%s/media_%s", flight_dir, process_dirname + (strlen("downloading_flight_"))); + //PRINT("medias directory : %s\n", media_dirname); + next_file = NULL; + while(FTP_SUCCEDED(academy_status) && (ptr = academy_get_next_item_with_prefix(fileList, &next_file, "picture_", FALSE))) + { + if((stat(media_dirname, &statbuf) != 0) && (mkdir(media_dirname, 0777) >= 0)) + PA_DEBUG("Create local media directory %s if not exist\n", media_dirname); - sprintf(local_filename, "%s/%s", media_dirname, ptr); - PA_DEBUG("Get %s from drone to local directory...", local_filename); - academy_status = ftpGet (academy_ftp, ptr, local_filename, 1, NULL); - if(FTP_SUCCEDED(academy_status)) - { - academy.new_media_callback((const char *)local_filename); - PA_DEBUG("OK\n"); - } - else - { - PA_DEBUG("ERROR\n"); - } - } + sprintf(local_filename, "%s/%s", media_dirname, ptr); + PA_DEBUG("Get %s from drone to local directory...", local_filename); + academy_status = ftpGet (academy_ftp, ptr, local_filename, 1, NULL); + if(FTP_SUCCEDED(academy_status)) + { + if (NULL != academy.new_media_callback) + { + academy.new_media_callback((const char *)local_filename, TRUE); + } + PA_DEBUG("OK\n"); + } + else + { + PA_DEBUG("ERROR\n"); + } + } + if (NULL != academy.new_media_callback) + { + academy.new_media_callback((const char *)NULL, FALSE); + } - if(FTP_SUCCEDED(academy_status) && !userbox_ready) - { - char local_dirname[ACADEMY_MAX_FILENAME]; - snprintf(local_dirname, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname); - remove(local_dirname); - } - } + if(FTP_SUCCEDED(academy_status) && !userbox_ready) + { + char local_dirname[ACADEMY_MAX_FILENAME]; + snprintf(local_dirname, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname); + remove(local_dirname); + } + } - if(FTP_SUCCEDED(academy_status)) - ftpCd(academy_ftp, ".."); - } - break; + if(FTP_SUCCEDED(academy_status)) + ftpCd(academy_ftp, ".."); + } + break; - case ACADEMY_STATE_FINISH_PROCESS: - { - char remove_dirname[ACADEMY_MAX_FILENAME]; - char src[ACADEMY_MAX_FILENAME]; - char dest[ACADEMY_MAX_FILENAME]; + case ACADEMY_STATE_FINISH_PROCESS: + { + char remove_dirname[ACADEMY_MAX_FILENAME]; + char src[ACADEMY_MAX_FILENAME]; + char dest[ACADEMY_MAX_FILENAME]; - // Rename local directory from downloading_flight_* to flight_* - snprintf(src, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname); - snprintf(dest, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname + strlen("downloading_")); - rename(src, dest); + // Rename local directory from downloading_flight_* to flight_* + snprintf(src, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname); + snprintf(dest, ACADEMY_MAX_FILENAME, "%s/%s", flight_dir, process_dirname + strlen("downloading_")); + rename(src, dest); - // Rename ftp remote directory from downloading_flight_* to ftpremove_downloading_flight_* - snprintf(remove_dirname, ACADEMY_MAX_FILENAME, "ftpremove_%s", process_dirname); - academy_status = ftpRename(academy_ftp, process_dirname, remove_dirname); + // Rename ftp remote directory from downloading_flight_* to ftpremove_downloading_flight_* + snprintf(remove_dirname, ACADEMY_MAX_FILENAME, "ftpremove_%s", process_dirname); + academy_status = ftpRename(academy_ftp, process_dirname, remove_dirname); - // Delete ftpremove_downloading_flight_* - if(FTP_SUCCEDED(academy_status)) - academy_status = academy_remove_ftp_directory(academy_ftp, remove_dirname); - } - break; + // Delete ftpremove_downloading_flight_* + if(FTP_SUCCEDED(academy_status)) + academy_status = academy_remove_ftp_directory(academy_ftp, remove_dirname); + } + break; - case ACADEMY_STATE_DISCONNECTION: - if(academy_ftp != NULL) - ftpClose(&academy_ftp); - academy_check_memory(); - academy_status = FTP_SUCCESS; - break; + case ACADEMY_STATE_DISCONNECTION: + if(academy_ftp != NULL) + ftpClose(&academy_ftp); + academy_check_memory(); + academy_status = FTP_SUCCESS; + break; - default: - // Nothing to do - PA_DEBUG("THIS CASE SHOULD NOT HAPPEN\n"); - break; - } + default: + // Nothing to do + PA_DEBUG("THIS CASE SHOULD NOT HAPPEN\n"); + break; + } - if(FTP_SUCCEDED(academy_status)) - { - PA_DEBUG("continue state from %d to %d\n", academy.state.state, (academy.state.state + 1) % ACADEMY_STATE_MAX); - academy_download_stateOK(&academy); + if(FTP_SUCCEDED(academy_status)) + { + PA_DEBUG("continue state from %d to %d\n", academy.state.state, (academy.state.state + 1) % ACADEMY_STATE_MAX); + academy_download_stateOK(&academy); academy_download_nextState(&academy); - } - else - { - PA_DEBUG("stop\n"); + } + else + { + PA_DEBUG("stop\n"); shouldGoInPause = TRUE; academy_download_stateERROR(&academy); - - if(fileList != NULL) - { - vp_os_free(fileList); - fileList = NULL; - } - if(academy_ftp) - ftpClose(&academy_ftp); - } - } + if(fileList != NULL) + { + vp_os_free(fileList); + fileList = NULL; + } - if(fileList != NULL) - { - vp_os_free(fileList); - fileList = NULL; - } + if(academy_ftp) + ftpClose(&academy_ftp); + } + } - if(academy_ftp) - ftpClose(&academy_ftp); - - } + if(fileList != NULL) + { + vp_os_free(fileList); + fileList = NULL; + } + + if(academy_ftp) + ftpClose(&academy_ftp); + + } while(academy_download_started && !ardrone_tool_exit()); vp_os_cond_destroy(&academy_download_cond); vp_os_mutex_destroy(&academy_download_mutex); - THREAD_RETURN(C_OK); + THREAD_RETURN(C_OK); } void academy_download_pause (void) diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_stage_recorder.c b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_stage_recorder.c index 52c7be9..2b0a7d9 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_stage_recorder.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_stage_recorder.c @@ -20,6 +20,10 @@ extern char flight_dir[]; #endif +#define ACADEMY_MEDIA_DIRPATH_FORMAT "%s/media_%s" +#define ACADEMY_MEDIA_VIDEO_FILEPATH_FORMAT "%s/video_%s.%s" +#define ACADEMY_MEDIA_DIR_ACCESS_RIGHT 0777 + static void ardrone_academy_stage_recorder_internal_close(ardrone_academy_stage_recorder_config_t *cfg); ardrone_academy_stage_recorder_config_t ardrone_academy_stage_recorder_config; @@ -53,14 +57,15 @@ ardrone_academy_stage_recorder_handle (ardrone_academy_stage_recorder_config_t * char media_dirname[ACADEMY_MAX_FILENAME]; struct stat statbuf; - sprintf(media_dirname, "%s/media_%s", ACADEMY_FILE_DEFAULT_PATH, date); - if((stat(media_dirname, &statbuf) != 0) && (mkdir(media_dirname, 0777) >= 0)) + sprintf(media_dirname, ACADEMY_MEDIA_DIRPATH_FORMAT, ACADEMY_FILE_DEFAULT_PATH, date); + if((stat(media_dirname, &statbuf) != 0) && (mkdir(media_dirname, ACADEMY_MEDIA_DIR_ACCESS_RIGHT) >= 0)) PA_DEBUG("Create local media directory %s if not exist\n", media_dirname); + // NO ELSE, the local directory already exists t = time(NULL); ardrone_time2date(t, ARDRONE_FILE_DATE_FORMAT, date); - sprintf(cfg->video_filename, "%s/video_%s.%s", + sprintf(cfg->video_filename, ACADEMY_MEDIA_VIDEO_FILEPATH_FORMAT, media_dirname, date, ACADEMY_RECORD_FILE_EXTENSION); @@ -81,6 +86,7 @@ ardrone_academy_stage_recorder_handle (ardrone_academy_stage_recorder_config_t * printf ("Can't open file %s\n", video_filename); } } + // NO ELSE - The record is already started or is starting break; case PIPELINE_MSG_STOP: @@ -89,14 +95,16 @@ ardrone_academy_stage_recorder_handle (ardrone_academy_stage_recorder_config_t * cfg->startRec = ACADEMY_RECORD_STOP; printf("Stop recording %s\n", cfg->video_filename); ardrone_academy_stage_recorder_internal_close(cfg); + result = C_OK; } + // NO ELSE - Record is already stopped. break; default: break; } - return (VP_SUCCESS); + return (result); } void ardrone_academy_stage_recorder_enable(bool_t enable, uint32_t timestamp) @@ -136,7 +144,7 @@ C_RESULT ardrone_academy_stage_recorder_transform(ardrone_academy_stage_recorder out->indexBuffer = 0; out->lineSize = NULL; } - + // NO ELSE - We need to initialize the number of buffers and the index of buffer in first. out->size = in->size; out->status = in->status; out->buffers = in->buffers; @@ -159,6 +167,11 @@ C_RESULT ardrone_academy_stage_recorder_transform(ardrone_academy_stage_recorder fwrite(&in->size, 1, sizeof(int32_t), cfg->fp); fwrite(in->buffers[in->indexBuffer], 1, in->size, cfg->fp); } + // NO ELSE because : + // If the descriptor file is NULL, we can't to write data. + // If data size to write is 0, we don't have data to write. + // If the status is not processing, it means the record is stopping. + // If startRec is not start, it means the record is stopping or is starting. vp_os_mutex_unlock( &out->lock ); #endif @@ -171,5 +184,8 @@ C_RESULT ardrone_academy_stage_recorder_close(ardrone_academy_stage_recorder_con { ardrone_academy_stage_recorder_internal_close(cfg); } + // NO ELSE because : + // If the descriptor file is NULL, we can't to write data. + return C_OK; } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_upload.c b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_upload.c index 447b233..77c67f5 100755 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_upload.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Academy/academy_upload.c @@ -117,18 +117,9 @@ static void academy_upload_private_callback(academy_state_t state) case ACADEMY_RESULT_OK: strcat(msg, "OK"); -// time_to_process += state.time_in_ms; - // if(state.state == ACADEMY_STATE_DRONE_DISCONNECTION) -// { - // sprintf(msg, "%s in %d ms\n", msg, time_to_process); - // time_to_process = 0; - // } break; case ACADEMY_RESULT_FAILED: - // if(state.state == ACADEMY_STATE_DRONE_PREPARE_DOWNLOAD) - // time_to_process = 0; - strcat(msg, "FAILED"); break; } @@ -231,7 +222,6 @@ DEFINE_THREAD_ROUTINE(academy_upload, data) struct dirent *dirent = NULL; DIR *dir = NULL; academy_status = FTP_FAIL; - // Check if flight_* directory exist in local dir if((dir = opendir(flight_dir)) != NULL) { @@ -350,7 +340,7 @@ DEFINE_THREAD_ROUTINE(academy_upload, data) // Penser à supprimer le fichier local academy_status = FTP_FAIL; sprintf(local_dir, "%s/%s", flight_dir, dirname); - if(!ftw(local_dir, &academy_remove, 1)) + if(!ftw(local_dir, &academy_remove, ACADEMY_MAX_FD_FOR_FTW)) { rmdir(local_dir); academy_status = FTP_SUCCESS; diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Control/ardrone_control.c b/ARDroneLib/Soft/Lib/ardrone_tool/Control/ardrone_control.c index 8d5a497..ee47021 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Control/ardrone_control.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Control/ardrone_control.c @@ -38,74 +38,69 @@ static vp_os_mutex_t event_queue_mutex; C_RESULT ardrone_control_init(void) { - COM_CONFIG_SOCKET_CONTROL(&control_socket, VP_COM_CLIENT, CONTROL_PORT, wifi_ardrone_ip); + COM_CONFIG_SOCKET_CONTROL(&control_socket, VP_COM_CLIENT, CONTROL_PORT, wifi_ardrone_ip); + + control_waited = FALSE; + ardrone_state = 0; - control_waited = FALSE; - ardrone_state = 0; + vp_os_mutex_init(&control_mutex); + vp_os_cond_init(&control_cond, &control_mutex); - vp_os_mutex_init(&control_mutex); - vp_os_cond_init(&control_cond, &control_mutex); + vp_os_mutex_init(&event_queue_mutex); - vp_os_mutex_init(&event_queue_mutex); + start_index_in_queue = 0; + end_index_in_queue = (start_index_in_queue - 1) & (ARDRONE_CONTROL_MAX_NUM_EVENTS_IN_QUEUE - 1); - start_index_in_queue = 0; - end_index_in_queue = (start_index_in_queue - 1) & (ARDRONE_CONTROL_MAX_NUM_EVENTS_IN_QUEUE - 1); - - return C_OK; + return C_OK; } C_RESULT ardrone_control_shutdown(void) { - ardrone_control_resume_on_navdata_received(0); - /*BUG FIX : Dont destroy the mutexes here, - they are still being used by the ardrone_control thread, - while this function is called by another thread.*/ -#ifdef THIS_IS_A_BUG - vp_os_mutex_destroy(&event_queue_mutex); - vp_os_cond_destroy(&control_cond); - vp_os_mutex_destroy(&control_mutex);*/ -#endif + ardrone_control_resume_on_navdata_received(0); + /*BUG FIX : Dont destroy the mutexes here, + they are still being used by the ardrone_control thread, + while this function is called by another thread.*/ - bContinue = FALSE; + bContinue = FALSE; - return C_OK; + return C_OK; } C_RESULT ardrone_control_connect_to_drone() { - int res_open_socket; + int res_open_socket; #ifdef _WIN32 - int timeout_windows=1000;/*milliseconds*/ + int timeout_windows=1000;/*milliseconds*/ #else - struct timeval tv; + struct timeval tv; #endif - res_open_socket = vp_com_open(COM_CONTROL(), &control_socket, &control_read, &control_write); - if( VP_SUCCEEDED(res_open_socket) ) - { - tv.tv_sec = 1; - tv.tv_usec = 0; + res_open_socket = vp_com_open(COM_CONTROL(), &control_socket, &control_read, &control_write); + if( VP_SUCCEEDED(res_open_socket) ) + { + tv.tv_sec = 1; + tv.tv_usec = 0; - setsockopt((int32_t)control_socket.priv, - SOL_SOCKET, - SO_RCVTIMEO, -#ifdef _WIN32 - (const char*)&timeout_windows, sizeof(timeout_windows) -#else - (const char*)&tv, sizeof(tv) -#endif - ); + setsockopt((int32_t)control_socket.priv, + SOL_SOCKET, + SO_RCVTIMEO, + #ifdef _WIN32 + (const char*)&timeout_windows, sizeof(timeout_windows) + #else + (const char*)&tv, sizeof(tv) + #endif + ); - control_socket.is_disable = FALSE; - return C_OK; - } - else - { - DEBUG_PRINT_SDK("VP_Com : Failed to open socket for control\n"); - perror("FTOSFC"); - return C_FAIL; - } + control_socket.is_disable = FALSE; + return C_OK; + } + else + { + DEBUG_PRINT_SDK("VP_Com : Failed to open socket for control\n"); + perror("FTOSFC"); + return C_FAIL; + } } @@ -115,201 +110,201 @@ C_RESULT ardrone_control_connect_to_drone() */ C_RESULT ardrone_control_resume_on_navdata_received(uint32_t new_ardrone_state) { - vp_os_mutex_lock(&control_mutex); + vp_os_mutex_lock(&control_mutex); if( control_waited ) - { - ardrone_state = new_ardrone_state; - vp_os_cond_signal(&control_cond); - } - vp_os_mutex_unlock(&control_mutex); - return C_OK; + { + ardrone_state = new_ardrone_state; + vp_os_cond_signal(&control_cond); + } + vp_os_mutex_unlock(&control_mutex); + return C_OK; } C_RESULT ardrone_control_read(uint8_t* buffer, int32_t* size) { - C_RESULT res = C_FAIL; + C_RESULT res = C_FAIL; - if( control_read != NULL ) - { - res = control_read(&control_socket, buffer, size); - if(*size == 0) - { - res = C_FAIL; - } - } + if( control_read != NULL ) + { + res = control_read(&control_socket, buffer, size); + if(*size == 0) + { + res = C_FAIL; + } + } - return res; + return res; } C_RESULT ardrone_control_write(const uint8_t* buffer, int32_t* size) { - C_RESULT res = C_FAIL; + C_RESULT res = C_FAIL; - if( control_write != NULL ) - { - res = control_write(&control_socket, buffer, size); - } + if( control_write != NULL ) + { + res = control_write(&control_socket, buffer, size); + } - return res; + return res; } C_RESULT ardrone_control_send_event( ardrone_control_event_t* event ) { - C_RESULT res; - int32_t next_index_in_queue; + C_RESULT res; + int32_t next_index_in_queue; - res = C_FAIL; + res = C_FAIL; - vp_os_mutex_lock(&event_queue_mutex); + vp_os_mutex_lock(&event_queue_mutex); next_index_in_queue = (start_index_in_queue + 1) & (ARDRONE_CONTROL_MAX_NUM_EVENTS_IN_QUEUE - 1); if( next_index_in_queue != end_index_in_queue ) { - ardrone_control_event_queue[start_index_in_queue] = event; - start_index_in_queue = next_index_in_queue; + ardrone_control_event_queue[start_index_in_queue] = event; + start_index_in_queue = next_index_in_queue; - res = C_OK; - } + res = C_OK; + } - vp_os_mutex_unlock(&event_queue_mutex); + vp_os_mutex_unlock(&event_queue_mutex); - return res; + return res; } DEFINE_THREAD_ROUTINE( ardrone_control, nomParams ) { - C_RESULT res_wait_navdata = C_OK; - C_RESULT res = C_OK; - uint32_t retry, current_ardrone_state; - int32_t next_index_in_queue; - ardrone_control_event_ptr_t current_event; - - retry = 0; - current_event = NULL; - - DEBUG_PRINT_SDK("Thread control in progress...\n"); - control_socket.is_disable = TRUE; - - ardrone_control_connect_to_drone(); + C_RESULT res_wait_navdata = C_OK; + C_RESULT res = C_OK; + uint32_t retry, current_ardrone_state; + int32_t next_index_in_queue; + ardrone_control_event_ptr_t current_event; + + retry = 0; + current_event = NULL; + + DEBUG_PRINT_SDK("Thread control in progress...\n"); + control_socket.is_disable = TRUE; + + ardrone_control_connect_to_drone(); while( bContinue - && !ardrone_tool_exit() ) - { - vp_os_mutex_lock(&control_mutex); - control_waited = TRUE; + && !ardrone_tool_exit() ) + { + vp_os_mutex_lock(&control_mutex); + control_waited = TRUE; - /* Wait for new navdata to be received. */ - res_wait_navdata = vp_os_cond_timed_wait(&control_cond, 1000); - vp_os_mutex_unlock(&control_mutex); + /* Wait for new navdata to be received. */ + res_wait_navdata = vp_os_cond_timed_wait(&control_cond, 1000); + vp_os_mutex_unlock(&control_mutex); - /* - * In case of timeout on the navdata, we assume that there was a problem - * with the Wifi connection. - * It is then safer to close and reopen the control socket (TCP 5559) since - * some OS might stop giving data but not signal any disconnection. - */ - if(VP_FAILED(res_wait_navdata)) - { + /* + * In case of timeout on the navdata, we assume that there was a problem + * with the Wifi connection. + * It is then safer to close and reopen the control socket (TCP 5559) since + * some OS might stop giving data but not signal any disconnection. + */ + if(VP_FAILED(res_wait_navdata)) + { if (FALSE == control_socket.is_disable) { - DEBUG_PRINT_SDK("Timeout while waiting for new navdata.\n"); + DEBUG_PRINT_SDK("Timeout while waiting for new navdata.\n"); vp_com_close(COM_CONTROL(), &control_socket); - control_socket.is_disable = TRUE; - } + control_socket.is_disable = TRUE; + } } else { - - if(control_socket.is_disable) - { - ardrone_control_connect_to_drone(); - } - - if(VP_SUCCEEDED(res_wait_navdata) && (!control_socket.is_disable)) - { - vp_os_mutex_lock(&control_mutex); - current_ardrone_state = ardrone_state; - control_waited = FALSE; - vp_os_mutex_unlock(&control_mutex); - - if( ardrone_tool_exit() ) // Test if we received a signal because we are quitting the application - THREAD_RETURN( res ); - - if( current_event == NULL ) - { - vp_os_mutex_lock(&event_queue_mutex); - next_index_in_queue = (end_index_in_queue + 1) & (ARDRONE_CONTROL_MAX_NUM_EVENTS_IN_QUEUE - 1); - - if( next_index_in_queue != start_index_in_queue ) - { // There's an event to process - current_event = ardrone_control_event_queue[next_index_in_queue]; - if( current_event != NULL ) - { - if( current_event->ardrone_control_event_start != NULL ) - { - current_event->ardrone_control_event_start( current_event ); - } - } - end_index_in_queue = next_index_in_queue; - - retry = 0; + + if(control_socket.is_disable) + { + ardrone_control_connect_to_drone(); + } + + if(VP_SUCCEEDED(res_wait_navdata) && (!control_socket.is_disable)) + { + vp_os_mutex_lock(&control_mutex); + current_ardrone_state = ardrone_state; + control_waited = FALSE; + vp_os_mutex_unlock(&control_mutex); + + if( ardrone_tool_exit() ) // Test if we received a signal because we are quitting the application + THREAD_RETURN( res ); + + if( current_event == NULL ) + { + vp_os_mutex_lock(&event_queue_mutex); + next_index_in_queue = (end_index_in_queue + 1) & (ARDRONE_CONTROL_MAX_NUM_EVENTS_IN_QUEUE - 1); + + if( next_index_in_queue != start_index_in_queue ) + { // There's an event to process + current_event = ardrone_control_event_queue[next_index_in_queue]; + if( current_event != NULL ) + { + if( current_event->ardrone_control_event_start != NULL ) + { + current_event->ardrone_control_event_start( current_event ); + } + } + end_index_in_queue = next_index_in_queue; + + retry = 0; + } + + vp_os_mutex_unlock(&event_queue_mutex); + } + + if( current_event != NULL ) + { + switch( current_event->event ) + { + case CFG_GET_CONTROL_MODE: + case CUSTOM_CFG_GET_CONTROL_MODE: /* multiconfiguration support */ + res = ardrone_control_configuration_run( current_ardrone_state, (ardrone_control_configuration_event_t*) current_event ); + break; + + case ACK_CONTROL_MODE: + res = ardrone_control_ack_run( current_ardrone_state, (ardrone_control_ack_event_t *) current_event); + break; + + default: + break; + } + + if( VP_FAILED(res) ) + { + retry ++; + if( retry > current_event->num_retries) + current_event->status = ARDRONE_CONTROL_EVENT_FINISH_FAILURE; + } + else + { + retry = 0; + } + + if( current_event->status & ARDRONE_CONTROL_EVENT_FINISH ) + { + if( current_event->ardrone_control_event_end != NULL ) + current_event->ardrone_control_event_end( current_event ); + + /* Make the thread read a new event on the next loop iteration */ + current_event = NULL; + } + else + { + /* Not changing 'current_event' makes the loop process the same + * event when the next navdata packet arrives. */ } + } + } + } + }// while - vp_os_mutex_unlock(&event_queue_mutex); - } + /*Bug fix - mutexes were previously detroyed by another thread, + which made ardrone_control crash.*/ + vp_os_mutex_destroy(&event_queue_mutex); + vp_os_cond_destroy(&control_cond); + vp_os_mutex_destroy(&control_mutex); - if( current_event != NULL ) - { - switch( current_event->event ) - { - case CFG_GET_CONTROL_MODE: - case CUSTOM_CFG_GET_CONTROL_MODE: /* multiconfiguration support */ - res = ardrone_control_configuration_run( current_ardrone_state, (ardrone_control_configuration_event_t*) current_event ); - break; + vp_com_close(COM_CONTROL(), &control_socket); - case ACK_CONTROL_MODE: - res = ardrone_control_ack_run( current_ardrone_state, (ardrone_control_ack_event_t *) current_event); - break; - - default: - break; - } - - if( VP_FAILED(res) ) - { - retry ++; - if( retry > current_event->num_retries) - current_event->status = ARDRONE_CONTROL_EVENT_FINISH_FAILURE; - } - else - { - retry = 0; - } - - if( current_event->status & ARDRONE_CONTROL_EVENT_FINISH ) - { - if( current_event->ardrone_control_event_end != NULL ) - current_event->ardrone_control_event_end( current_event ); - - /* Make the thread read a new event on the next loop iteration */ - current_event = NULL; - } - else - { - /* Not changing 'current_event' makes the loop process the same - * event when the next navdata packet arrives. */ - } - } - } - } - }// while - - /* Stephane : Bug fix - mutexes were previously detroyed by another thread, - which made ardrone_control crash.*/ - vp_os_mutex_destroy(&event_queue_mutex); - vp_os_cond_destroy(&control_cond); - vp_os_mutex_destroy(&control_mutex); - - vp_com_close(COM_CONTROL(), &control_socket); - - THREAD_RETURN( res ); + THREAD_RETURN( res ); } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_academy_navdata.c b/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_academy_navdata.c index a80915c..e8669e1 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_academy_navdata.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_academy_navdata.c @@ -24,61 +24,61 @@ typedef enum { - SCREENSHOT_STATE_IDLE, - SCREENSHOT_STATE_NEEDED, - SCREENSHOT_STATE_INPROGRESS, + SCREENSHOT_STATE_IDLE, + SCREENSHOT_STATE_NEEDED, + SCREENSHOT_STATE_INPROGRESS, } SCREENSHOT_STATE; typedef enum { - TAKEOFF_STATE_IDLE, - TAKEOFF_STATE_NEEDED, - TAKEOFF_STATE_WAIT_USERBOX, - TAKEOFF_STATE_CANCELLING, + TAKEOFF_STATE_IDLE, + TAKEOFF_STATE_NEEDED, + TAKEOFF_STATE_WAIT_USERBOX, + TAKEOFF_STATE_CANCELLING, } TAKEOFF_STATE; typedef enum { - RECORD_STATE_IDLE, - RECORD_STATE_NEEDED, - RECORD_STATE_WAIT_USERBOX, + RECORD_STATE_IDLE, + RECORD_STATE_NEEDED, + RECORD_STATE_WAIT_USERBOX, } RECORD_STATE; typedef enum { - USERBOX_STATE_STARTING, - USERBOX_STATE_STARTED, - USERBOX_STATE_STOPPING, - USERBOX_STATE_STOPPED, + USERBOX_STATE_STARTING, + USERBOX_STATE_STARTED, + USERBOX_STATE_STOPPING, + USERBOX_STATE_STOPPED, } USERBOX_STATE; typedef struct { - /** - * variable to know if setting is needed - */ - bool_t wasEmergency; - bool_t needSetEmergency; - TAKEOFF_STATE takeoff_state; - time_t takeoff_time; - RECORD_STATE record_state; - USERBOX_STATE userbox_state; - SCREENSHOT_STATE screenshot_state; - time_t userbox_time; - vp_os_mutex_t aan_mutex; + /** + * variable to know if setting is needed + */ + bool_t wasEmergency; + bool_t needSetEmergency; + TAKEOFF_STATE takeoff_state; + time_t takeoff_time; + RECORD_STATE record_state; + USERBOX_STATE userbox_state; + SCREENSHOT_STATE screenshot_state; + time_t userbox_time; + vp_os_mutex_t aan_mutex; uint32_t usbFreeTime; bool_t droneStoppedUsbRecording; bool_t takeOffWasCancelled; - /** - * Strings to display in interface - */ - bool_t isTakeOff; - bool_t isEmergency; + /** + * Strings to display in interface + */ + bool_t isTakeOff; + bool_t isEmergency; uint32_t lastState; - bool_t cameraIsReady; - bool_t usbIsReady; - bool_t usbRecordInProgress; + bool_t cameraIsReady; + bool_t usbIsReady; + bool_t usbRecordInProgress; bool_t internalRecordInProgress; } ardrone_academy_navdata_state_t; @@ -97,10 +97,10 @@ bool_t ardrone_academy_navdata_takeoff(void) bool_t shouldNotDo = (TRUE == isBatteryLow && FALSE == navdata_state.isTakeOff) ? TRUE : FALSE; if(navdata_state.takeoff_state == TAKEOFF_STATE_IDLE && FALSE == shouldNotDo) - { - LOCK_ND_MUTEX (); - navdata_state.takeoff_state = TAKEOFF_STATE_NEEDED; - navdata_state.takeoff_time = time (NULL); +{ + LOCK_ND_MUTEX (); + navdata_state.takeoff_state = TAKEOFF_STATE_NEEDED; + navdata_state.takeoff_time = time (NULL); UNLOCK_ND_MUTEX (); result = TRUE; } @@ -110,20 +110,20 @@ bool_t ardrone_academy_navdata_takeoff(void) bool_t ardrone_academy_navdata_emergency(void) { bool_t result = TRUE; - LOCK_ND_MUTEX (); - navdata_state.needSetEmergency = TRUE; - UNLOCK_ND_MUTEX (); + LOCK_ND_MUTEX (); + navdata_state.needSetEmergency = TRUE; + UNLOCK_ND_MUTEX (); return result; } bool_t ardrone_academy_navdata_record(void) { bool_t result = FALSE; - if(navdata_state.record_state == RECORD_STATE_IDLE) + if(navdata_state.record_state == RECORD_STATE_IDLE) { - LOCK_ND_MUTEX (); - navdata_state.record_state = RECORD_STATE_NEEDED; - UNLOCK_ND_MUTEX (); + LOCK_ND_MUTEX (); + navdata_state.record_state = RECORD_STATE_NEEDED; + UNLOCK_ND_MUTEX (); result = TRUE; } return result; @@ -132,11 +132,11 @@ bool_t ardrone_academy_navdata_record(void) bool_t ardrone_academy_navdata_screenshot(void) { bool_t result = FALSE; - if(navdata_state.screenshot_state == SCREENSHOT_STATE_IDLE) + if(navdata_state.screenshot_state == SCREENSHOT_STATE_IDLE) { - LOCK_ND_MUTEX (); - navdata_state.screenshot_state = SCREENSHOT_STATE_NEEDED; - UNLOCK_ND_MUTEX (); + LOCK_ND_MUTEX (); + navdata_state.screenshot_state = SCREENSHOT_STATE_NEEDED; + UNLOCK_ND_MUTEX (); result = TRUE; } return result; @@ -144,40 +144,40 @@ bool_t ardrone_academy_navdata_screenshot(void) bool_t ardrone_academy_navdata_get_camera_state(void) { - return (navdata_state.cameraIsReady && (navdata_state.screenshot_state == SCREENSHOT_STATE_IDLE)); + return (navdata_state.cameraIsReady && (navdata_state.screenshot_state == SCREENSHOT_STATE_IDLE)); } bool_t ardrone_academy_navdata_get_usb_state(void) { - return navdata_state.usbIsReady; + return navdata_state.usbIsReady; } bool_t ardrone_academy_navdata_get_takeoff_state(void) { - return navdata_state.isTakeOff; + return navdata_state.isTakeOff; } bool_t ardrone_academy_navdata_get_record_ready(void) { - bool_t result = FALSE; - - if(1 == ARDRONE_VERSION()) + bool_t result = FALSE; + + if(1 == ARDRONE_VERSION()) { - result = ardrone_academy_stage_recorder_state(); + result = ardrone_academy_stage_recorder_state(); } - else if(2 == ARDRONE_VERSION()) + else if(2 == ARDRONE_VERSION()) { #if defined (RECORD_ENCODED_VIDEO) - result = (video_stage_encoded_recorder_state() || navdata_state.usbRecordInProgress); + result = (video_stage_encoded_recorder_state() || navdata_state.usbRecordInProgress); #else - printf("ARDRONE VERSION 2 NEEDS RECORD_ENCODED_VIDEO MACRO!!!\n"); + PRINT("ARDRONE VERSION 2 NEEDS RECORD_ENCODED_VIDEO MACRO!!!\n"); #endif } - else + else { - printf("ARDRONE VERSION NOT INITIALIZED !!!\n"); + PRINT("ARDRONE VERSION NOT INITIALIZED !!!\n"); } - return result; + return result; } bool_t ardrone_academy_navdata_get_record_state(void) @@ -196,19 +196,19 @@ bool_t ardrone_academy_navdata_get_record_state(void) ( VIDEO_ENCODED_STOPPED != recState && VIDEO_ENCODED_WAITING_STREAM_END != recState); #else - printf("ARDRONE VERSION 2 NEEDS RECORD_ENCODED_VIDEO MACRO!!!\n"); + PRINT("ARDRONE VERSION 2 NEEDS RECORD_ENCODED_VIDEO MACRO!!!\n"); #endif } else { - printf("ARDRONE VERSION NOT INITIALIZED !!!\n"); + PRINT("ARDRONE VERSION NOT INITIALIZED !!!\n"); } return result; } bool_t ardrone_academy_navdata_get_emergency_state(void) { - return navdata_state.isEmergency; + return navdata_state.isEmergency; } uint32_t ardrone_academy_navdata_get_remaining_usb_time (void) @@ -236,154 +236,154 @@ bool_t ardrone_academy_navdata_check_takeoff_cancelled (void) void ardrone_academy_navdata_recorder_enable(bool_t enable, uint32_t timestamp) { - if(1 == ARDRONE_VERSION()) + if(1 == ARDRONE_VERSION()) { - ardrone_academy_stage_recorder_enable(enable, timestamp); + ardrone_academy_stage_recorder_enable(enable, timestamp); } - else if(2 == ARDRONE_VERSION()) + else if(2 == ARDRONE_VERSION()) { #if defined (RECORD_ENCODED_VIDEO) - if (1 == enable) + if (1 == enable) { - /* - Calling this function to disable the recorder is to be made outside - a navdata handler, so we can finish a video even if the drone is - disconnected (battery removed, or out of wifi range) - The disable call is made inside the UI "button press" callbacks - */ - video_stage_encoded_recorder_enable(enable, timestamp); + /* + Calling this function to disable the recorder is to be made outside + a navdata handler, so we can finish a video even if the drone is + disconnected (battery removed, or out of wifi range) + The disable call is made inside the UI "button press" callbacks + */ + video_stage_encoded_recorder_enable(enable, timestamp); } #else - printf("ARDRONE VERSION 2 NEEDS RECORD_ENCODED_VIDEO MACRO!!!\n"); + PRINT("ARDRONE VERSION 2 NEEDS RECORD_ENCODED_VIDEO MACRO!!!\n"); #endif } - else + else { - printf("ARDRONE VERSION NOT INITIALIZED !!!\n"); + PRINT("ARDRONE VERSION NOT INITIALIZED !!!\n"); } } FLYING_STATE ardrone_academy_navdata_get_flying_state(const navdata_unpacked_t* data) { - FLYING_STATE tmp_state; - switch ((data->navdata_demo.ctrl_state >> 16)) + FLYING_STATE tmp_state; + switch ((data->navdata_demo.ctrl_state >> 16)) { case CTRL_FLYING: case CTRL_HOVERING: case CTRL_TRANS_GOTOFIX: case CTRL_TRANS_LOOPING: - tmp_state = FLYING_STATE_FLYING; - break; - + tmp_state = FLYING_STATE_FLYING; + break; + case CTRL_TRANS_TAKEOFF: - tmp_state = FLYING_STATE_TAKING_OFF; - break; - + tmp_state = FLYING_STATE_TAKING_OFF; + break; + case CTRL_TRANS_LANDING: - tmp_state = FLYING_STATE_LANDING; - break; - + tmp_state = FLYING_STATE_LANDING; + break; + case CTRL_DEFAULT: case CTRL_LANDED: default: - tmp_state = FLYING_STATE_LANDED; - break; + tmp_state = FLYING_STATE_LANDED; + break; } - return tmp_state; + return tmp_state; } void ardrone_academy_navdata_userbox_cb(bool_t result) { - if(result) + if(result) { - LOCK_ND_MUTEX (); - if(navdata_state.userbox_state == USERBOX_STATE_STARTING) + LOCK_ND_MUTEX (); + if(navdata_state.userbox_state == USERBOX_STATE_STARTING) { - printf("Userbox started\n"); - navdata_state.userbox_state = USERBOX_STATE_STARTED; - - switch (navdata_state.takeoff_state) + PRINT("Userbox started\n"); + navdata_state.userbox_state = USERBOX_STATE_STARTED; + + switch (navdata_state.takeoff_state) { case TAKEOFF_STATE_WAIT_USERBOX: - navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; - ardrone_tool_set_ui_pad_start(1); - break; + navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; + ardrone_tool_set_ui_pad_start(1); + break; case TAKEOFF_STATE_CANCELLING: - navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; - ardrone_tool_set_ui_pad_start(0); - break; + navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; + ardrone_tool_set_ui_pad_start(0); + break; default: - break; + break; } - - - if(navdata_state.record_state == RECORD_STATE_WAIT_USERBOX) + + + if(navdata_state.record_state == RECORD_STATE_WAIT_USERBOX) { - navdata_state.record_state = RECORD_STATE_IDLE; - if (FALSE == navdata_state.usbRecordInProgress) - { - ardrone_academy_navdata_recorder_enable(TRUE, navdata_state.userbox_time); - } + navdata_state.record_state = RECORD_STATE_IDLE; + if (FALSE == navdata_state.usbRecordInProgress) + { + ardrone_academy_navdata_recorder_enable(TRUE, navdata_state.userbox_time); } } - else if(navdata_state.userbox_state == USERBOX_STATE_STOPPING) + } + else if(navdata_state.userbox_state == USERBOX_STATE_STOPPING) { - printf("Userbox stopped\n"); - academy_download_resume (); - if(navdata_state.takeoff_state == TAKEOFF_STATE_WAIT_USERBOX || - TAKEOFF_STATE_CANCELLING == navdata_state.takeoff_state) + PRINT("Userbox stopped\n"); + academy_download_resume (); + if(navdata_state.takeoff_state == TAKEOFF_STATE_WAIT_USERBOX || + TAKEOFF_STATE_CANCELLING == navdata_state.takeoff_state) { - navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; - ardrone_tool_set_ui_pad_start(0); + navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; + ardrone_tool_set_ui_pad_start(0); } - if(navdata_state.record_state == RECORD_STATE_WAIT_USERBOX) + if(navdata_state.record_state == RECORD_STATE_WAIT_USERBOX) { - navdata_state.record_state = RECORD_STATE_IDLE; - ardrone_academy_navdata_recorder_enable(FALSE, navdata_state.userbox_time); - navdata_state.usbRecordInProgress = FALSE; + navdata_state.record_state = RECORD_STATE_IDLE; + ardrone_academy_navdata_recorder_enable(FALSE, navdata_state.userbox_time); + navdata_state.usbRecordInProgress = FALSE; } - navdata_state.userbox_state = USERBOX_STATE_STOPPED; + navdata_state.userbox_state = USERBOX_STATE_STOPPED; } - UNLOCK_ND_MUTEX (); + UNLOCK_ND_MUTEX (); } } void ardrone_academy_navdata_screenshot_cb(bool_t result) { - if(result) + if(result) { - LOCK_ND_MUTEX (); - if(navdata_state.screenshot_state == SCREENSHOT_STATE_INPROGRESS) + LOCK_ND_MUTEX (); + if(navdata_state.screenshot_state == SCREENSHOT_STATE_INPROGRESS) { - navdata_state.screenshot_state = SCREENSHOT_STATE_IDLE; + navdata_state.screenshot_state = SCREENSHOT_STATE_IDLE; } - UNLOCK_ND_MUTEX (); + UNLOCK_ND_MUTEX (); } } void ardrone_academy_check_take_off_timeout (void) { - static char cancelCommand[ARDRONE_DATE_MAXSIZE]; - time_t elapsedTime = time (NULL) - navdata_state.takeoff_time; - if (TAKEOFF_TIMEOUT_SEC < elapsedTime) + static char cancelCommand[ARDRONE_DATE_MAXSIZE]; + time_t elapsedTime = time (NULL) - navdata_state.takeoff_time; + if (TAKEOFF_TIMEOUT_SEC < elapsedTime) { - switch (navdata_state.takeoff_state) + switch (navdata_state.takeoff_state) { case TAKEOFF_STATE_WAIT_USERBOX: - snprintf (cancelCommand, ARDRONE_DATE_MAXSIZE-1, "%d", USERBOX_CMD_CANCEL); - navdata_state.userbox_state = USERBOX_STATE_STOPPING; - navdata_state.takeoff_state = TAKEOFF_STATE_CANCELLING; - ARDRONE_TOOL_CONFIGURATION_ADDEVENT (userbox_cmd, cancelCommand, ardrone_academy_navdata_userbox_cb); + snprintf (cancelCommand, ARDRONE_DATE_MAXSIZE-1, "%d", USERBOX_CMD_CANCEL); + navdata_state.userbox_state = USERBOX_STATE_STOPPING; + navdata_state.takeoff_state = TAKEOFF_STATE_CANCELLING; + ARDRONE_TOOL_CONFIGURATION_ADDEVENT (userbox_cmd, cancelCommand, ardrone_academy_navdata_userbox_cb); navdata_state.takeOffWasCancelled = TRUE; - break; + break; case TAKEOFF_STATE_NEEDED: - navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; + navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; navdata_state.takeOffWasCancelled = TRUE; - break; + break; default: - break; + break; } } } @@ -391,58 +391,58 @@ void ardrone_academy_check_take_off_timeout (void) void ardrone_academy_navdata_userbox_switch(void) { - static char param[ARDRONE_DATE_MAXSIZE + 8]; - static char date[ARDRONE_DATE_MAXSIZE]; - if(navdata_state.userbox_state == USERBOX_STATE_STOPPED) + static char param[ARDRONE_DATE_MAXSIZE + 8]; + static char date[ARDRONE_DATE_MAXSIZE]; + if(navdata_state.userbox_state == USERBOX_STATE_STOPPED) { - navdata_state.userbox_time = time(NULL); - ardrone_time2date(navdata_state.userbox_time, ARDRONE_FILE_DATE_FORMAT, date); - sprintf(param, "%d,%s", USERBOX_CMD_START, date); - navdata_state.userbox_state = USERBOX_STATE_STARTING; - ARDRONE_TOOL_CONFIGURATION_ADDEVENT(userbox_cmd, param, ardrone_academy_navdata_userbox_cb); + navdata_state.userbox_time = time(NULL); + ardrone_time2date(navdata_state.userbox_time, ARDRONE_FILE_DATE_FORMAT, date); + sprintf(param, "%d,%s", USERBOX_CMD_START, date); + navdata_state.userbox_state = USERBOX_STATE_STARTING; + ARDRONE_TOOL_CONFIGURATION_ADDEVENT(userbox_cmd, param, ardrone_academy_navdata_userbox_cb); } - else if(navdata_state.userbox_state == USERBOX_STATE_STARTED) + else if(navdata_state.userbox_state == USERBOX_STATE_STARTED) { - sprintf(param, "%d", USERBOX_CMD_STOP); - navdata_state.userbox_state = USERBOX_STATE_STOPPING; - ARDRONE_TOOL_CONFIGURATION_ADDEVENT(userbox_cmd, param, ardrone_academy_navdata_userbox_cb); + sprintf(param, "%d", USERBOX_CMD_STOP); + navdata_state.userbox_state = USERBOX_STATE_STOPPING; + ARDRONE_TOOL_CONFIGURATION_ADDEVENT(userbox_cmd, param, ardrone_academy_navdata_userbox_cb); } } C_RESULT ardrone_academy_navdata_init(void* data) { - navdata_state.wasEmergency = FALSE; - navdata_state.needSetEmergency = FALSE; - navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; - navdata_state.record_state = TAKEOFF_STATE_IDLE; - navdata_state.userbox_state = USERBOX_STATE_STOPPED; - navdata_state.isTakeOff = FALSE; - navdata_state.isEmergency = FALSE; - navdata_state.cameraIsReady = FALSE; - navdata_state.usbIsReady = FALSE; - navdata_state.usbRecordInProgress = FALSE; - navdata_state.userbox_time = (time_t)0; - navdata_state.takeoff_time = (time_t)0; + navdata_state.wasEmergency = FALSE; + navdata_state.needSetEmergency = FALSE; + navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; + navdata_state.record_state = TAKEOFF_STATE_IDLE; + navdata_state.userbox_state = USERBOX_STATE_STOPPED; + navdata_state.isTakeOff = FALSE; + navdata_state.isEmergency = FALSE; + navdata_state.cameraIsReady = FALSE; + navdata_state.usbIsReady = FALSE; + navdata_state.usbRecordInProgress = FALSE; + navdata_state.userbox_time = (time_t)0; + navdata_state.takeoff_time = (time_t)0; navdata_state.usbFreeTime = 0; navdata_state.droneStoppedUsbRecording = FALSE; navdata_state.takeOffWasCancelled = FALSE; navdata_state.internalRecordInProgress = FALSE; navdata_state.lastState = 0; - vp_os_mutex_init (&navdata_state.aan_mutex); + vp_os_mutex_init (&navdata_state.aan_mutex); - return C_OK; + return C_OK; } C_RESULT ardrone_academy_navdata_process( const navdata_unpacked_t* const pnd ) { - static bool_t prevCameraIsReady = FALSE; + static bool_t prevCameraIsReady = FALSE; static bool_t prevDroneUsbRecording = FALSE; - if (C_OK == TRYLOCK_ND_MUTEX ()) + if (C_OK == TRYLOCK_ND_MUTEX ()) { - input_state_t* input_state = ardrone_tool_input_get_state(); + input_state_t* input_state = ardrone_tool_input_get_state(); bool_t recordIsReady = ! ardrone_academy_navdata_get_record_ready(); bool_t recordIsInProgress = ardrone_academy_navdata_get_record_state(); - + // Save ARDrone State navdata_state.lastState = pnd->ardrone_state; @@ -462,80 +462,80 @@ C_RESULT ardrone_academy_navdata_process( const navdata_unpacked_t* const pnd ) } prevDroneUsbRecording = currentDroneUsbRecording; - ardrone_academy_check_take_off_timeout (); + ardrone_academy_check_take_off_timeout (); - // Take off and Emergency management - if(navdata_state.takeoff_state == TAKEOFF_STATE_NEEDED) - { - if(pnd->ardrone_state & ARDRONE_EMERGENCY_MASK) + // Take off and Emergency management + if(navdata_state.takeoff_state == TAKEOFF_STATE_NEEDED) + { + if(pnd->ardrone_state & ARDRONE_EMERGENCY_MASK) { - navdata_state.needSetEmergency = TRUE; + navdata_state.needSetEmergency = TRUE; } - else + else { if(recordIsInProgress) { - if(!(pnd->ardrone_state & ARDRONE_USER_FEEDBACK_START)) - ardrone_tool_set_ui_pad_start(1); - else - ardrone_tool_set_ui_pad_start(0); - navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; + if(!(pnd->ardrone_state & ARDRONE_USER_FEEDBACK_START)) + ardrone_tool_set_ui_pad_start(1); + else + ardrone_tool_set_ui_pad_start(0); + navdata_state.takeoff_state = TAKEOFF_STATE_IDLE; } - else + else { - navdata_state.takeoff_state = TAKEOFF_STATE_WAIT_USERBOX; - ardrone_academy_navdata_userbox_switch(); + navdata_state.takeoff_state = TAKEOFF_STATE_WAIT_USERBOX; + ardrone_academy_navdata_userbox_switch(); } } - } + } - if(navdata_state.needSetEmergency) - { - ardrone_tool_set_ui_pad_select(1); - navdata_state.needSetEmergency = FALSE; - } + if(navdata_state.needSetEmergency) + { + ardrone_tool_set_ui_pad_select(1); + navdata_state.needSetEmergency = FALSE; + } - if(pnd->ardrone_state & ARDRONE_EMERGENCY_MASK) + if(pnd->ardrone_state & ARDRONE_EMERGENCY_MASK) { - if(!navdata_state.wasEmergency && (input_state->user_input & (1 << ARDRONE_UI_BIT_SELECT))) + if(!navdata_state.wasEmergency && (input_state->user_input & (1 << ARDRONE_UI_BIT_SELECT))) { - ardrone_tool_set_ui_pad_select(0); + ardrone_tool_set_ui_pad_select(0); } - - navdata_state.isEmergency = TRUE; - navdata_state.isTakeOff = FALSE; + + navdata_state.isEmergency = TRUE; + navdata_state.isTakeOff = FALSE; if(!navdata_state.internalRecordInProgress && !navdata_state.usbRecordInProgress && (navdata_state.userbox_state == USERBOX_STATE_STARTED)) { - printf("Emergency !! Stopping userbox...\n"); - ardrone_academy_navdata_userbox_switch(); + PRINT("Emergency !! Stopping userbox...\n"); + ardrone_academy_navdata_userbox_switch(); } - ardrone_tool_input_start_reset(); + ardrone_tool_input_start_reset(); } - else // Not emergency landing + else // Not emergency landing { - if(navdata_state.wasEmergency && (input_state->user_input & (1 << ARDRONE_UI_BIT_SELECT))) + if(navdata_state.wasEmergency && (input_state->user_input & (1 << ARDRONE_UI_BIT_SELECT))) { - ardrone_tool_set_ui_pad_select(0); + ardrone_tool_set_ui_pad_select(0); } + + if(!(pnd->ardrone_state & ARDRONE_TIMER_ELAPSED)) + navdata_state.isEmergency = FALSE; - if(!(pnd->ardrone_state & ARDRONE_TIMER_ELAPSED)) - navdata_state.isEmergency = FALSE; - - if(input_state->user_input & (1 << ARDRONE_UI_BIT_START)) + if(input_state->user_input & (1 << ARDRONE_UI_BIT_START)) { - navdata_state.isTakeOff = (pnd->ardrone_state & ARDRONE_USER_FEEDBACK_START) ? TRUE : FALSE; + navdata_state.isTakeOff = (pnd->ardrone_state & ARDRONE_USER_FEEDBACK_START) ? TRUE : FALSE; } - else + else { - navdata_state.isTakeOff = FALSE; + navdata_state.isTakeOff = FALSE; } } - navdata_state.wasEmergency = (pnd->ardrone_state & ARDRONE_EMERGENCY_MASK) ? TRUE : FALSE; - - // Video record management + navdata_state.wasEmergency = (pnd->ardrone_state & ARDRONE_EMERGENCY_MASK) ? TRUE : FALSE; + + // Video record management bool_t usbRecordEnable = FALSE; if(navdata_state.record_state == RECORD_STATE_NEEDED && @@ -544,34 +544,34 @@ C_RESULT ardrone_academy_navdata_process( const navdata_unpacked_t* const pnd ) bool_t continueRecord = TRUE; bool_t nextInternalRecordState = FALSE; if (IS_LEAST_ARDRONE2) - { - static codec_type_t oldCodec; + { + static codec_type_t oldCodec; codec_type_t cancelCodec; if (recordIsReady && ! navdata_state.usbRecordInProgress && !navdata_state.internalRecordInProgress) // We want to enable recording - { - if ((ARDRONE_USB_MASK == (pnd->ardrone_state & ARDRONE_USB_MASK)) && + { + if ((ARDRONE_USB_MASK == (pnd->ardrone_state & ARDRONE_USB_MASK)) && (0 < pnd->navdata_hdvideo_stream.usbkey_remaining_time) && - (TRUE == ardrone_control_config.video_on_usb)) - { + (TRUE == ardrone_control_config.video_on_usb)) + { usbRecordEnable = TRUE; - } + } // Set the "non-record codec" to the codec defined as the application default oldCodec = ardrone_application_default_config.video_codec; cancelCodec = oldCodec; ardrone_control_config.video_codec = (TRUE == usbRecordEnable) ? usbRecordCodec : deviceWifiRecordCodec; - printf ("Set codec %d -> %d\n", oldCodec, ardrone_control_config.video_codec); + PRINT ("Set codec %d -> %d\n", oldCodec, ardrone_control_config.video_codec); nextInternalRecordState = TRUE; - } - else // We want to disable recording - { + } + else // We want to disable recording + { cancelCodec = ardrone_control_config.video_codec; - ardrone_control_config.video_codec = oldCodec; - printf ("Reset codec %d -> %d\n", cancelCodec, oldCodec); - } + ardrone_control_config.video_codec = oldCodec; + PRINT ("Reset codec %d -> %d\n", cancelCodec, oldCodec); + } bool_t addEventSucceeded = ARDRONE_TOOL_CONFIGURATION_ADDEVENT (video_codec, &ardrone_control_config.video_codec, NULL); if (FALSE == addEventSucceeded) { - printf ("Unable to send codec switch ... retry later\n"); + PRINT ("Unable to send codec switch ... retry later\n"); ardrone_control_config.video_codec = cancelCodec; continueRecord = FALSE; } @@ -584,93 +584,93 @@ C_RESULT ardrone_academy_navdata_process( const navdata_unpacked_t* const pnd ) if (TRUE == continueRecord) { navdata_state.internalRecordInProgress = nextInternalRecordState; - switch (navdata_state.userbox_state) - { - case USERBOX_STATE_STOPPED: - navdata_state.record_state = RECORD_STATE_WAIT_USERBOX; + switch (navdata_state.userbox_state) + { + case USERBOX_STATE_STOPPED: + navdata_state.record_state = RECORD_STATE_WAIT_USERBOX; navdata_state.usbRecordInProgress = usbRecordEnable; - ardrone_academy_navdata_userbox_switch(); - break; - case USERBOX_STATE_STARTED: - if(navdata_state.isTakeOff) - { + ardrone_academy_navdata_userbox_switch(); + break; + case USERBOX_STATE_STARTED: + if(navdata_state.isTakeOff) + { if(! recordIsReady) - { - printf("Userbox is started and record is started => Stop record\n"); - ardrone_academy_navdata_recorder_enable(FALSE, navdata_state.userbox_time); - navdata_state.usbRecordInProgress = FALSE; - } - else - { - printf("Userbox is started and record is stopped => Start record\n"); + { + PRINT("Userbox is started and record is started => Stop record\n"); + ardrone_academy_navdata_recorder_enable(FALSE, navdata_state.userbox_time); + navdata_state.usbRecordInProgress = FALSE; + } + else + { + PRINT("Userbox is started and record is stopped => Start record\n"); if (FALSE == usbRecordEnable) - { - // Only activate the local recorder if we don't record on USB - ardrone_academy_navdata_recorder_enable(TRUE, navdata_state.userbox_time); + { + // Only activate the local recorder if we don't record on USB + ardrone_academy_navdata_recorder_enable(TRUE, navdata_state.userbox_time); navdata_state.usbRecordInProgress = FALSE; } else { navdata_state.usbRecordInProgress = TRUE; - } } + } - navdata_state.record_state = RECORD_STATE_IDLE; - } - else - { - navdata_state.record_state = RECORD_STATE_WAIT_USERBOX; - ardrone_academy_navdata_userbox_switch(); - } - break; - case USERBOX_STATE_STARTING: + navdata_state.record_state = RECORD_STATE_IDLE; + } + else + { + navdata_state.record_state = RECORD_STATE_WAIT_USERBOX; + ardrone_academy_navdata_userbox_switch(); + } + break; + case USERBOX_STATE_STARTING: navdata_state.usbRecordInProgress = usbRecordEnable; - navdata_state.record_state = RECORD_STATE_WAIT_USERBOX; - break; - case USERBOX_STATE_STOPPING: + navdata_state.record_state = RECORD_STATE_WAIT_USERBOX; + break; + case USERBOX_STATE_STOPPING: navdata_state.usbRecordInProgress = usbRecordEnable; - // Should never be here - PRINT ("Don't know what to do for USERBOX_STATE_STOPPING\n"); - VP_OS_ASSERT (0 == 1); // Debug handler - break; + // Should never be here + PRINT ("Don't know what to do for USERBOX_STATE_STOPPING\n"); + VP_OS_ASSERT (0 == 1); // Debug handler + break; } } } - // Screenshot management - prevCameraIsReady = navdata_state.cameraIsReady; - navdata_state.cameraIsReady = (pnd->ardrone_state & ARDRONE_CAMERA_MASK) ? TRUE : FALSE; - if (TRUE == navdata_state.cameraIsReady && FALSE == prevCameraIsReady) - { - academy_download_resume (); - } + // Screenshot management + prevCameraIsReady = navdata_state.cameraIsReady; + navdata_state.cameraIsReady = (pnd->ardrone_state & ARDRONE_CAMERA_MASK) ? TRUE : FALSE; + if (TRUE == navdata_state.cameraIsReady && FALSE == prevCameraIsReady) + { + academy_download_resume (); + } - if((navdata_state.screenshot_state == SCREENSHOT_STATE_NEEDED) && navdata_state.cameraIsReady) - { - char param[ARDRONE_DATE_MAXSIZE + 64]; - char date[ARDRONE_DATE_MAXSIZE]; - time_t t = time(NULL); - ardrone_time2date(t, ARDRONE_FILE_DATE_FORMAT, date); - navdata_state.screenshot_state = SCREENSHOT_STATE_INPROGRESS; - sprintf(param, "%d,%d,%d,%s", USERBOX_CMD_SCREENSHOT, 0, 0, date); - ARDRONE_TOOL_CONFIGURATION_ADDEVENT(userbox_cmd, (char*)param, ardrone_academy_navdata_screenshot_cb); - } + if((navdata_state.screenshot_state == SCREENSHOT_STATE_NEEDED) && navdata_state.cameraIsReady) + { + static char param[ARDRONE_DATE_MAXSIZE + 64]; + static char date[ARDRONE_DATE_MAXSIZE]; + time_t t = time(NULL); + ardrone_time2date(t, ARDRONE_FILE_DATE_FORMAT, date); + navdata_state.screenshot_state = SCREENSHOT_STATE_INPROGRESS; + sprintf(param, "%d,%d,%d,%s", USERBOX_CMD_SCREENSHOT, 0, 0, date); + ARDRONE_TOOL_CONFIGURATION_ADDEVENT(userbox_cmd, param, ardrone_academy_navdata_screenshot_cb); + } - // USB management - navdata_state.usbIsReady = (pnd->ardrone_state & ARDRONE_USB_MASK) ? TRUE : FALSE; - UNLOCK_ND_MUTEX (); + // USB management + navdata_state.usbIsReady = (pnd->ardrone_state & ARDRONE_USB_MASK) ? TRUE : FALSE; + UNLOCK_ND_MUTEX (); } - return C_OK; + return C_OK; } C_RESULT ardrone_academy_navdata_release( void ) { - if(ardrone_academy_navdata_get_record_state()) + if(ardrone_academy_navdata_get_record_state()) { - ardrone_academy_navdata_recorder_enable(FALSE, navdata_state.userbox_time); + ardrone_academy_navdata_recorder_enable(FALSE, navdata_state.userbox_time); } - vp_os_mutex_destroy (&navdata_state.aan_mutex); - return C_OK; + vp_os_mutex_destroy (&navdata_state.aan_mutex); + return C_OK; } void ardrone_academy_navdata_set_wifi_record_codec (codec_type_t newCodec) diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_general_navdata.c b/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_general_navdata.c index 5b3a6ee..5a37a14 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_general_navdata.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_general_navdata.c @@ -35,11 +35,11 @@ static inline int versionSupportsMulticonfiguration (const char *currentString) #define _GENERAL_NAVDATA_DEBUG_PREFIX "General Navdata : " #if _GENERAL_NAVDATA_DEBUG || defined (DEBUG) #define PRINTDBG(...) \ - do \ + do \ { \ - printf ("[%d] %s", __LINE__, _GENERAL_NAVDATA_DEBUG_PREFIX); \ - printf (__VA_ARGS__); \ - printf ("\n"); \ + printf ("[%d] %s", __LINE__, _GENERAL_NAVDATA_DEBUG_PREFIX); \ + printf (__VA_ARGS__); \ + printf ("\n"); \ } while (0) #else #define PRINTDBG(...) @@ -50,7 +50,7 @@ static void sendInitConfigurations(void) } static void switchToSession(void) -{ +{ ARDRONE_TOOL_CONFIGURATION_ADDEVENT (session_id, ses_id, NULL); } @@ -142,7 +142,7 @@ C_RESULT ardrone_general_navdata_process( const navdata_unpacked_t* const pnd ) navdata_mode_t current_navdata_state = NAVDATA_BOOTSTRAP; /* Makes sure the navdata stream will be resumed if the drone is disconnected and reconnected. - * Allows changing the drone battery during debugging sessions. */ + * Allows changing the drone battery during debugging sessions. */ if( ardrone_get_mask_from_state(pnd->ardrone_state, ARDRONE_NAVDATA_BOOTSTRAP) ) { current_navdata_state = NAVDATA_BOOTSTRAP; @@ -154,7 +154,16 @@ C_RESULT ardrone_general_navdata_process( const navdata_unpacked_t* const pnd ) if (current_navdata_state == NAVDATA_BOOTSTRAP && configState == MULTICONFIG_IDLE && navdataState == NAVDATA_REQUEST_IDLE) { - navdataState = NAVDATA_REQUEST_NEEDED; + if ((0 != strncmp(ardrone_control_config.application_id, app_id, APPLI_NAME_SIZE)) || + (0 != strncmp(ardrone_control_config.profile_id, usr_id, USER_NAME_SIZE)) || + (0 != strncmp(ardrone_control_config.session_id, ses_id, SESSION_NAME_SIZE))) + { + configState = MULTICONFIG_NEEDED; + } + else + { + navdataState = NAVDATA_REQUEST_NEEDED; + } } /* Multiconfig settings */ @@ -318,14 +327,14 @@ C_RESULT ardrone_general_navdata_process( const navdata_unpacked_t* const pnd ) navdataState = NAVDATA_REQUEST_IN_PROGRESS; switchToSession(); // Resend session id when reconnecting. sendInitConfigurations(); - ARDRONE_TOOL_CONFIGURATION_ADDEVENT(navdata_demo, &ardrone_application_default_config.navdata_demo, NULL); + ARDRONE_TOOL_CONFIGURATION_ADDEVENT (navdata_demo, &ardrone_application_default_config.navdata_demo, NULL); ARDRONE_TOOL_CONFIGURATION_ADDEVENT (navdata_options, &ardrone_application_default_config.navdata_options, navdataCallback); break; case NAVDATA_REQUEST_DONE: // Refresh configuration file PRINTDBG ("Refreshing from NAVDATA FSM"); navdataState = NAVDATA_REQUEST_IDLE; - ARDRONE_TOOL_CONFIGURATION_GET (NULL); + ARDRONE_TOOL_CONFIGURATION_GET (NULL); break; case NAVDATA_REQUEST_IN_PROGRESS: case NAVDATA_REQUEST_IDLE: @@ -421,6 +430,7 @@ ardrone_users_t *ardrone_get_user_list(void) if (NULL == retVal->userList) { vp_os_free (retVal); + retVal = NULL; return NULL; } strncpy (retVal->userList[validUserCount-1].ident, available_configurations[CAT_USER].list[configIndex].id, MULTICONFIG_ID_SIZE); @@ -438,6 +448,7 @@ void ardrone_free_user_list (ardrone_users_t **users) if (NULL != (*users)->userList) { vp_os_free ((*users)->userList); + (*users)->userList = NULL; } vp_os_free (*users); *users = NULL; diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_navdata_client.h b/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_navdata_client.h index 4c06973..f985080 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_navdata_client.h +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/ardrone_navdata_client.h @@ -18,35 +18,35 @@ // Handler to resume control thread is mandatory #define BEGIN_NAVDATA_HANDLER_TABLE \ ardrone_navdata_handler_t ardrone_navdata_handler_table[] = { \ - { ardrone_navdata_control_init, ardrone_navdata_control_process, ardrone_navdata_control_release, NULL }, \ + { ardrone_navdata_control_init, ardrone_navdata_control_process, ardrone_navdata_control_release, NULL }, \ { ardrone_general_navdata_init, ardrone_general_navdata_process, ardrone_general_navdata_release, NULL }, \ { video_navdata_handler_init, video_navdata_handler_process, video_navdata_handler_release, NULL }, \ { ardrone_academy_navdata_init, ardrone_academy_navdata_process, ardrone_academy_navdata_release, NULL }, #define END_NAVDATA_HANDLER_TABLE \ { NULL, NULL, NULL, NULL } \ - }; +}; #define NAVDATA_HANDLER_TABLE_ENTRY( init, process, release, init_data_ptr ) \ - { (ardrone_navdata_handler_init_t)init, process, release, init_data_ptr }, + { (ardrone_navdata_handler_init_t)init, process, release, init_data_ptr }, typedef C_RESULT (*ardrone_navdata_handler_init_t)( void* data ); typedef C_RESULT (*ardrone_navdata_handler_process_t)( const navdata_unpacked_t* const navdata ); typedef C_RESULT (*ardrone_navdata_handler_release_t)( void ); typedef struct _ardrone_navdata_handler_t { - ardrone_navdata_handler_init_t init; - ardrone_navdata_handler_process_t process; - ardrone_navdata_handler_release_t release; + ardrone_navdata_handler_init_t init; + ardrone_navdata_handler_process_t process; + ardrone_navdata_handler_release_t release; - void* data; // Data used during initialization + void* data; // Data used during initialization } ardrone_navdata_handler_t; typedef enum { - NAVDATA_BOOTSTRAP = 0, - NAVDATA_DEMO, - NAVDATA_FULL + NAVDATA_BOOTSTRAP = 0, + NAVDATA_DEMO, + NAVDATA_FULL } navdata_mode_t; extern ardrone_navdata_handler_t ardrone_navdata_handler_table[] WEAK; diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/navdata.c b/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/navdata.c index 525eaa0..d497af4 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/navdata.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Navdata/navdata.c @@ -49,6 +49,11 @@ navdata_option_t* ardrone_navdata_search_option( navdata_option_t* navdata_optio { ptr = (uint8_t*) navdata_options_ptr; ptr += navdata_options_ptr->size; + if (0 == navdata_options_ptr->size) + { + navdata_options_ptr = NULL; + break; + } navdata_options_ptr = (navdata_option_t*) ptr; } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_com_stage.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_com_stage.c index 9bb3b77..42ac32b 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_com_stage.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_com_stage.c @@ -28,9 +28,9 @@ typedef int socklen_t; #define PDBG(...) \ do \ { \ - printf ("V_COM_STAGE: %s:%d : ", __FUNCTION__, __LINE__); \ - printf (__VA_ARGS__); \ - printf ("\n"); \ + PRINT ("V_COM_STAGE: %s:%d : ", __FUNCTION__, __LINE__); \ + PRINT (__VA_ARGS__); \ + PRINT ("\n"); \ } while (0) #else #define PDBG(...) @@ -116,20 +116,20 @@ C_RESULT video_com_stage_connect (video_com_config_t *cfg) if( cfg->protocol == VP_COM_PROBE) { - printf("\n\nPROBING\n"); + PRINT("\n\nPROBING\n"); cfg->socket.protocol = VP_COM_TCP; res = vp_com_open(cfg->com, &cfg->socket, &cfg->read, &cfg->write); if( VP_SUCCEEDED(res) ) { - printf("\n\nTCP\n"); + PRINT("\n\nTCP\n"); vp_com_close (cfg->com, &cfg->socket); cfg->protocol = VP_COM_TCP; } else { - printf("\n\nUDP\n"); + PRINT("\n\nUDP\n"); cfg->protocol = VP_COM_UDP; } } @@ -230,11 +230,11 @@ C_RESULT video_com_multisocket_stage_open(video_com_multisocket_config_t *cfg) cfg->configs[i]->mustReconnect = 0; } - printf("Video multisocket : init %i sockets\n",cfg->nb_sockets); + PRINT("Video multisocket : init %i sockets\n",cfg->nb_sockets); for(i=0;inb_sockets;i++) { - printf("Video multisocket : connecting socket %d on port %d %s\n", + PRINT("Video multisocket : connecting socket %d on port %d %s\n", i, cfg->configs[i]->socket.port, (cfg->configs[i]->protocol==VP_COM_TCP)?"TCP":"UDP"); @@ -242,7 +242,7 @@ C_RESULT video_com_multisocket_stage_open(video_com_multisocket_config_t *cfg) cfg->configs[i]->connected = FALSE; res = video_com_stage_connect(cfg->configs[i]); if (!VP_SUCCEEDED(res)) { - printf(" - Connection failed\n"); + PRINT(" - Connection failed\n"); nb_failed_connections++; } @@ -266,9 +266,9 @@ C_RESULT video_com_stage_transform(video_com_config_t *cfg, vp_api_io_data_t *in if (1 == cfg->mustReconnect) { PDBG ("Will call connect"); - printf ("Reconnecting ... "); + PRINT ("Reconnecting ... "); res = video_com_stage_connect (cfg); - printf ("%s\n", (VP_FAILED (res) ? "FAIL" : "OK")); + PRINT ("%s\n", (VP_FAILED (res) ? "FAIL" : "OK")); cfg->mustReconnect = 0; } @@ -313,10 +313,10 @@ C_RESULT video_com_stage_transform(video_com_config_t *cfg, vp_api_io_data_t *in PDBG ("%s [%d] : status set to error !\n", __FUNCTION__, __LINE__); perror ("Video_com_stage"); cfg->mustReconnect = 1; - out->size = 0; + out->size = 0; vp_os_mutex_unlock (&out->lock); return C_OK; - } + } if( out->size == 0) { @@ -377,7 +377,7 @@ C_RESULT video_com_stage_transform(video_com_config_t *cfg, vp_api_io_data_t *in C_RESULT video_com_multisocket_stage_transform(video_com_multisocket_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out) { - C_RESULT res,res2; + C_RESULT res; fd_set rfds; int retval; int fs,maxfs; @@ -394,10 +394,10 @@ C_RESULT video_com_multisocket_stage_transform(video_com_multisocket_config_t *c if (1 == cfg->configs[i]->mustReconnect) { PDBG ("Will call connect"); - printf ("Reconnecting ... "); + PRINT ("Reconnecting ... "); res = C_FAIL; res = video_com_stage_connect (cfg->configs[i]); - printf ("%s\n", (VP_FAILED (res) ? "FAIL" : "OK")); + PRINT ("%s\n", (VP_FAILED (res) ? "FAIL" : "OK")); cfg->configs[i]->mustReconnect = 0; } } @@ -480,20 +480,20 @@ C_RESULT video_com_multisocket_stage_transform(video_com_multisocket_config_t *c if(i == cfg->nb_sockets) { - printf("%s:%d BUG !!!!!", __FUNCTION__, __LINE__); + PRINT("%s:%d BUG !!!!!", __FUNCTION__, __LINE__); selectTimeout = TRUE; } } } else { - DEBUG_PRINT_SDK("%s\n",(retval==0) ? "timeout" : "error"); + DEBUG_PRINT_SDK("%s\n",(retval==0)?"timeout":"error"); selectTimeout = TRUE; } if (FALSE == selectTimeout) { - DEBUG_PRINT_SDK ("Will read on socket %d\n", i); + // DEBUG_PRINT_SDK ("Will read on socket %d\n", i); // Actual first time read res = cfg->configs[i]->read(&cfg->configs[i]->socket, out->buffers[0], &out->size); if (VP_FAILED (res)) @@ -504,7 +504,7 @@ C_RESULT video_com_multisocket_stage_transform(video_com_multisocket_config_t *c out->size = 0; vp_os_mutex_unlock (&out->lock); return C_OK; - } + } // Loop read to empty the socket buffers if needed cfg->configs[i]->socket.block = VP_COM_DONTWAIT; @@ -512,14 +512,14 @@ C_RESULT video_com_multisocket_stage_transform(video_com_multisocket_config_t *c int32_t readSize = cfg->configs[i]->buffer_size - out->size; while (TRUE == bContinue) { - DEBUG_PRINT_SDK ("Will read %d octets from socket %d\n", readSize, i); + // DEBUG_PRINT_SDK ("Will read %d octets from socket %d\n", readSize, i); res = cfg->configs[i]->read(&cfg->configs[i]->socket, &(out->buffers[0][out->size]), &readSize); if (VP_FAILED (res)) { PDBG ("%s [%d] : status set to error !\n", __FUNCTION__, __LINE__); perror ("Video_com_stage"); cfg->configs[i]->mustReconnect = 1; - out->size = 0; + out->size = 0; vp_os_mutex_unlock (&out->lock); return C_OK; } @@ -551,7 +551,7 @@ C_RESULT video_com_multisocket_stage_transform(video_com_multisocket_config_t *c DEBUG_PRINT_SDK("Video multisocket : sending connection byte on port %s %d\n", (cfg->configs[i]->socket.protocol==VP_COM_TCP)?"TCP":"UDP",cfg->configs[i]->socket.port); - res2 = cfg->configs[i]->write(&cfg->configs[i]->socket, (uint8_t*) &flag, &len); + cfg->configs[i]->write(&cfg->configs[i]->socket, (uint8_t*) &flag, &len); } } } @@ -566,7 +566,7 @@ C_RESULT video_com_multisocket_stage_transform(video_com_multisocket_config_t *c if((selectTimeout == TRUE) && cfg->forceNonBlocking && *(cfg->forceNonBlocking)==TRUE) { - //printf("Debug %s:%d\n",__FUNCTION__,__LINE__); + //PRINT("Debug %s:%d\n",__FUNCTION__,__LINE__); /* No data are available here, but some are available in the next stage */ /* out->size=0 would restart the pipeline */ diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_recorder_pipeline.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_recorder_pipeline.c index bbafbd1..f939179 100755 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_recorder_pipeline.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_recorder_pipeline.c @@ -61,7 +61,7 @@ DEFINE_THREAD_ROUTINE(video_recorder, data) vp_api_io_stage_t stages[3]; PIPELINE_HANDLE video_recorder_pipeline_handle; video_recorder_thread_param_t *video_recorder_thread_param = (video_recorder_thread_param_t *)data; - + video_stage_tcp_config_t tcpConf; if(video_recorder_thread_param != NULL) diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage.c index f6b5943..967808a 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage.c @@ -197,14 +197,21 @@ DEFINE_THREAD_ROUTINE(video_stage, data) { } vp_os_free(params->pre_processing_stages_list->stages_list); + params->pre_processing_stages_list->stages_list = NULL; vp_os_free(params->post_processing_stages_list->stages_list); + params->post_processing_stages_list->stages_list = NULL; vp_os_free(params->pre_processing_stages_list); + params->pre_processing_stages_list = NULL; vp_os_free(params->post_processing_stages_list); + params->post_processing_stages_list = NULL; vp_os_free(params->in_pic); + params->in_pic = NULL; vp_os_free(params->out_pic); + params->out_pic = NULL; vp_os_free(params); + params = NULL; vp_api_close(&pipeline, &video_pipeline_handle); } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_decoder.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_decoder.c index cd8580d..c95b0e4 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_decoder.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_decoder.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #ifndef USE_ANDROID @@ -18,19 +19,22 @@ # define mp4h264_open ittiam_stage_decoding_open # define mp4h264_transform ittiam_stage_decoding_transform # define mp4h264_close ittiam_stage_decoding_close +static const int resetDecoderOnStreamChange = 1; # else // FFMPEG # define mp4h264_open ffmpeg_stage_decoding_open # define mp4h264_transform ffmpeg_stage_decoding_transform # define mp4h264_close ffmpeg_stage_decoding_close +static const int resetDecoderOnStreamChange = 0; # endif -#else +#else // ANDROID typedef enum { - NEON_SUPPORT_UNKNOWN = 0, - NEON_SUPPORT_OK, - NEON_SUPPORT_FAIL, + NEON_SUPPORT_UNKNOWN = 0, + NEON_SUPPORT_OK, + NEON_SUPPORT_FAIL, } neon_status_t; -static neon_status_t neonStatus = NEON_SUPPORT_UNKNOWN; +static neon_status_t neonStatus = NEON_SUPPORT_FAIL; // <<< FORCE FFMPEG <<< +static int resetDecoderOnStreamChange = 0; // NON CONST as it will be set at runtime C_RESULT mp4h264_open (mp4h264_config_t *cfg); C_RESULT mp4h264_transform (mp4h264_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out); @@ -48,19 +52,19 @@ float DEBUG_decodingTimeUsec = 0.0; #define ENABLE_VIDEO_STAGE_DECODER_DEBUG (0) const vp_api_stage_funcs_t video_decoding_funcs = { - (vp_api_stage_handle_msg_t) NULL, - (vp_api_stage_open_t) video_stage_decoder_open, - (vp_api_stage_transform_t) video_stage_decoder_transform, - (vp_api_stage_close_t) video_stage_decoder_close + (vp_api_stage_handle_msg_t) NULL, + (vp_api_stage_open_t) video_stage_decoder_open, + (vp_api_stage_transform_t) video_stage_decoder_transform, + (vp_api_stage_close_t) video_stage_decoder_close }; #if ENABLE_VIDEO_STAGE_DECODER_DEBUG || defined (DEBUG) #define PDBG(...) \ - do \ + do \ { \ - printf ("VIDEO_STAGE_DECODER (%s@%d) : ", __FUNCTION__, __LINE__); \ - printf (__VA_ARGS__); \ - printf ("\n"); \ + printf ("VIDEO_STAGE_DECODER (%s@%d) : ", __FUNCTION__, __LINE__); \ + printf (__VA_ARGS__); \ + printf ("\n"); \ } while (0) #else #define PDBG(...) @@ -68,13 +72,13 @@ const vp_api_stage_funcs_t video_decoding_funcs = { #define ALLOC_CHECK(POINTER, SIZE) \ - do \ + do \ { \ - POINTER = vp_os_calloc (SIZE, 1); \ - if (NULL == POINTER) \ + POINTER = vp_os_calloc (SIZE, 1); \ + if (NULL == POINTER) \ { \ - printf ("Unable to alloc %s\n", #POINTER); \ - return C_FAIL; \ + printf ("Unable to alloc %s\n", #POINTER); \ + return C_FAIL; \ } \ } while (0) @@ -88,286 +92,295 @@ parrot_video_encapsulation_codecs_t video_stage_decoder_lastDetectedCodec = 0; C_RESULT video_stage_decoder_open (video_decoder_config_t *cfg) { - // Allocate internal datas - ALLOC_CHECK (cfg->vlibConf, sizeof (vlib_stage_decoding_config_t)); - ALLOC_CHECK (cfg->vlibOut, sizeof (vp_api_io_data_t)); - ALLOC_CHECK (cfg->mp4h264Conf, sizeof (mp4h264_config_t)); - ALLOC_CHECK (cfg->mp4h264Out, sizeof (vp_api_io_data_t)); + // Allocate internal datas + ALLOC_CHECK (cfg->vlibConf, sizeof (vlib_stage_decoding_config_t)); + ALLOC_CHECK (cfg->vlibOut, sizeof (vp_api_io_data_t)); + ALLOC_CHECK (cfg->mp4h264Conf, sizeof (mp4h264_config_t)); + ALLOC_CHECK (cfg->mp4h264Out, sizeof (vp_api_io_data_t)); - // Fill alloc'd structs with data from cfg - // --> MPEG4 / H264 - cfg->mp4h264Conf->dst_picture.format = cfg->dst_picture->format; - // --> VLIB - cfg->vlibConf->width = cfg->dst_picture->width; - cfg->vlibConf->height = cfg->dst_picture->height; - cfg->vlibConf->picture = cfg->dst_picture; - cfg->vlibConf->luma_only = FALSE; - cfg->vlibConf->block_mode_enable = TRUE; + // Fill alloc'd structs with data from cfg + // --> MPEG4 / H264 + cfg->mp4h264Conf->dst_picture.format = cfg->dst_picture->format; + // --> VLIB + cfg->vlibConf->width = cfg->dst_picture->width; + cfg->vlibConf->height = cfg->dst_picture->height; + cfg->vlibConf->picture = cfg->dst_picture; + cfg->vlibConf->luma_only = FALSE; + cfg->vlibConf->block_mode_enable = TRUE; - switch (cfg->dst_picture->format) + switch (cfg->dst_picture->format) { case PIX_FMT_RGB565: - cfg->bpp=2; - break; + cfg->bpp=2; + break; case PIX_FMT_RGB24: - cfg->bpp=3; - break; + cfg->bpp=3; + break; default: - cfg->bpp=0; - break; + cfg->bpp=0; + break; } - - - vlib_stage_decoding_open (cfg->vlibConf); - mp4h264_open (cfg->mp4h264Conf); - return C_OK; + + vlib_stage_decoding_open (cfg->vlibConf); + mp4h264_open (cfg->mp4h264Conf); + + return C_OK; } static inline bool_t havePaVE (uint8_t *buffer) { - if (buffer [0] == 'P' && - buffer [1] == 'a' && - buffer [2] == 'V' && - buffer [3] == 'E') + if (buffer [0] == 'P' && + buffer [1] == 'a' && + buffer [2] == 'V' && + buffer [3] == 'E') { - return TRUE; + return TRUE; } - else + else { - return FALSE; + return FALSE; } } C_RESULT video_stage_decoder_transform (video_decoder_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out) { - C_RESULT retVal = C_OK; - bool_t useVlib = FALSE; - bool_t useMP4H264 = FALSE; - vp_api_io_data_t *outToCopy = NULL; - uint8_t *buffer = in->buffers[in->indexBuffer]; - static int lastDecodedStreamID = -1; + C_RESULT retVal = C_OK; + bool_t useVlib = FALSE; + bool_t useMP4H264 = FALSE; + vp_api_io_data_t *outToCopy = NULL; + uint8_t *buffer = in->buffers[in->indexBuffer]; + static int lastDecodedStreamID = -1; #if defined(TARGET_OS_IPHONE) || defined (TARGET_OS_IPHONE_SIMULATOR) - uint64_t startTime = 0; - uint64_t stopTime = 0; - uint64_t elapsedNano = 0; - static mach_timebase_info_data_t sTimebaseInfo; - if (0 == sTimebaseInfo.denom) + uint64_t startTime = 0; + uint64_t stopTime = 0; + uint64_t elapsedNano = 0; + static mach_timebase_info_data_t sTimebaseInfo; + if (0 == sTimebaseInfo.denom) { - mach_timebase_info (&sTimebaseInfo); + mach_timebase_info (&sTimebaseInfo); } - startTime = mach_absolute_time (); + startTime = mach_absolute_time (); #endif - - // Check for PaVE - if (havePaVE (buffer)) + + // Check for PaVE + if (havePaVE (buffer)) { - parrot_video_encapsulation_t *PaVE = (parrot_video_encapsulation_t *)buffer; - - video_stage_decoder_lastDetectedCodec = PaVE->video_codec; + parrot_video_encapsulation_t *PaVE = (parrot_video_encapsulation_t *)buffer; - if (lastDecodedStreamID!=-1 && lastDecodedStreamID!=PaVE->stream_id) + video_stage_decoder_lastDetectedCodec = PaVE->video_codec; + + if (lastDecodedStreamID!=-1 && lastDecodedStreamID!=PaVE->stream_id && 1 == resetDecoderOnStreamChange) { - printf("Resetting the video decoder.\n"); - video_stage_decoder_close(cfg); - video_stage_decoder_open(cfg); + PRINT("Resetting the video decoder.\n"); + video_stage_decoder_close(cfg); + video_stage_decoder_open(cfg); } - lastDecodedStreamID=PaVE->stream_id; + lastDecodedStreamID=PaVE->stream_id; - if (CODEC_VLIB == PaVE->video_codec || - CODEC_P264 == PaVE->video_codec) + if (CODEC_VLIB == PaVE->video_codec || + CODEC_P264 == PaVE->video_codec) { - useVlib = TRUE; + useVlib = TRUE; } - else if (CODEC_MPEG4_VISUAL == PaVE->video_codec || - CODEC_MPEG4_AVC == PaVE->video_codec) + else if (CODEC_MPEG4_VISUAL == PaVE->video_codec || + CODEC_MPEG4_AVC == PaVE->video_codec) { - useMP4H264 = TRUE; + useMP4H264 = TRUE; } - else + else { - // Unknown codec - return C_FAIL; + // Unknown codec + return C_FAIL; } } - else if ( ((*(uint32_t*)buffer) & 0xFFFE7C00 )== 0 ) /* true if a UVLC or P264 header is present */ + else if ( ((*(uint32_t*)buffer) & 0xFFFE7C00 )== 0 ) /* true if a UVLC or P264 header is present */ { - /* Test bits 15 and 16 of the header to differenciate UVLC and P264 */ - video_stage_decoder_lastDetectedCodec = ( ((*(uint32_t*)buffer) & 0x8000 )== 0x8000 ) ? CODEC_VLIB : CODEC_P264; - // No PaVE -> give to VLIB - useVlib = TRUE; + /* Test bits 15 and 16 of the header to differenciate UVLC and P264 */ + video_stage_decoder_lastDetectedCodec = ( ((*(uint32_t*)buffer) & 0x8000 )== 0x8000 ) ? CODEC_VLIB : CODEC_P264; + // No PaVE -> give to VLIB + useVlib = TRUE; } - else + else { - // Unknown codec - printf(" -- Critical error : unrecognized codec (first bytes : %x %x %x %x %x) --\n", - buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]); - return C_FAIL; + // Unknown codec + printf(" -- Critical error : unrecognized codec (first bytes : %x %x %x %x %x) --\n", + buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]); + return C_FAIL; } - if (useVlib) + if (useVlib) { - cfg->vlibConf->num_picture_decoded = cfg->num_picture_decoded; - - retVal = vlib_stage_decoding_transform (cfg->vlibConf, in, cfg->vlibOut); - if (C_FAIL == retVal) + cfg->vlibConf->num_picture_decoded = cfg->num_picture_decoded; + + retVal = vlib_stage_decoding_transform (cfg->vlibConf, in, cfg->vlibOut); + if (C_FAIL == retVal) { - return retVal; + return retVal; } - cfg->num_picture_decoded = cfg->vlibConf->num_picture_decoded; - cfg->num_frames = cfg->vlibConf->controller.num_frames; - - cfg->src_picture->height = cfg->vlibConf->controller.height; - cfg->src_picture->width = cfg->vlibConf->controller.width; - cfg->rowstride = cfg->dst_picture->width * cfg->bpp; // Size of the buffer we got for VLIB - cfg->vlibOut->size = cfg->rowstride * cfg->dst_picture->height; - outToCopy = cfg->vlibOut; + cfg->num_picture_decoded = cfg->vlibConf->num_picture_decoded; + cfg->num_frames = cfg->vlibConf->controller.num_frames; + + cfg->src_picture->height = cfg->vlibConf->controller.height; + cfg->src_picture->width = cfg->vlibConf->controller.width; + cfg->rowstride = cfg->dst_picture->width * cfg->bpp; // Size of the buffer we got for VLIB + cfg->vlibOut->size = cfg->rowstride * cfg->dst_picture->height; + outToCopy = cfg->vlibOut; } - if (useMP4H264) + if (useMP4H264) { - parrot_video_encapsulation_t *PaVE = (parrot_video_encapsulation_t *)buffer; - - cfg->mp4h264Conf->num_picture_decoded = cfg->num_picture_decoded; - - retVal = mp4h264_transform (cfg->mp4h264Conf, in, cfg->mp4h264Out); - if (C_FAIL == retVal) + parrot_video_encapsulation_t *PaVE = (parrot_video_encapsulation_t *)buffer; + + cfg->mp4h264Conf->num_picture_decoded = cfg->num_picture_decoded; + + retVal = mp4h264_transform (cfg->mp4h264Conf, in, cfg->mp4h264Out); + if (C_FAIL == retVal) { - return retVal; + return retVal; } - cfg->num_picture_decoded = cfg->mp4h264Conf->num_picture_decoded; - cfg->num_frames = PaVE->frame_number; - - cfg->dst_picture->height = cfg->mp4h264Conf->dst_picture.height; - cfg->dst_picture->width = cfg->mp4h264Conf->dst_picture.width; - cfg->src_picture->height = cfg->mp4h264Conf->src_picture.height; - cfg->src_picture->width = cfg->mp4h264Conf->src_picture.width; - cfg->rowstride = cfg->dst_picture->width * cfg->bpp; // Size of the actual picture, alloc'd by MPEG4 / H264 stage - outToCopy = cfg->mp4h264Out; + cfg->num_picture_decoded = cfg->mp4h264Conf->num_picture_decoded; + cfg->num_frames = PaVE->frame_number; + + cfg->dst_picture->height = cfg->mp4h264Conf->dst_picture.height; + cfg->dst_picture->width = cfg->mp4h264Conf->dst_picture.width; + cfg->src_picture->height = cfg->mp4h264Conf->src_picture.height; + cfg->src_picture->width = cfg->mp4h264Conf->src_picture.width; + cfg->rowstride = cfg->dst_picture->width * cfg->bpp; // Size of the actual picture, alloc'd by MPEG4 / H264 stage + outToCopy = cfg->mp4h264Out; } - if (NULL == outToCopy) + if (NULL == outToCopy) { - retVal = C_FAIL; + retVal = C_FAIL; } - else + else { - out->numBuffers = outToCopy->numBuffers; - out->buffers = outToCopy->buffers; - out->indexBuffer = outToCopy->indexBuffer; - out->size = outToCopy->size; - out->lineSize = outToCopy->lineSize; - out->status = outToCopy->status; + out->numBuffers = outToCopy->numBuffers; + out->buffers = outToCopy->buffers; + out->indexBuffer = outToCopy->indexBuffer; + out->size = outToCopy->size; + out->lineSize = outToCopy->lineSize; + out->status = outToCopy->status; - retVal = C_OK; + retVal = C_OK; } #if defined(TARGET_OS_IPHONE) || defined (TARGET_OS_IPHONE_SIMULATOR) - stopTime = mach_absolute_time (); - elapsedNano = (stopTime - startTime) * sTimebaseInfo.numer / sTimebaseInfo.denom; - if (0.0 == DEBUG_decodingTimeUsec) + stopTime = mach_absolute_time (); + elapsedNano = (stopTime - startTime) * sTimebaseInfo.numer / sTimebaseInfo.denom; + if (0.0 == DEBUG_decodingTimeUsec) { - DEBUG_decodingTimeUsec = elapsedNano / 1000.0; + DEBUG_decodingTimeUsec = elapsedNano / 1000.0; } - else + else { - DEBUG_decodingTimeUsec = 0.9 * DEBUG_decodingTimeUsec + (0.1 * elapsedNano / 1000.0); + DEBUG_decodingTimeUsec = 0.9 * DEBUG_decodingTimeUsec + (0.1 * elapsedNano / 1000.0); } #endif #ifdef USE_LINUX - usleep(video_stage_decoder_fakeLatency * 1000); + usleep(video_stage_decoder_fakeLatency * 1000); #endif - - return retVal; + + return retVal; } C_RESULT video_stage_decoder_close (video_decoder_config_t *cfg) { - C_RESULT res, resVlib, resMp4h264; - resVlib = vlib_stage_decoding_close (cfg->vlibConf); - resMp4h264 = mp4h264_close (cfg->mp4h264Conf); - res = (C_OK == resVlib && C_OK == resMp4h264 ) ? C_OK : C_FAIL; - vp_os_free (cfg->vlibConf); - cfg->vlibConf = NULL; - vp_os_free (cfg->vlibOut); - cfg->vlibOut = NULL; - vp_os_free (cfg->mp4h264Conf); - cfg->mp4h264Conf = NULL; - vp_os_free (cfg->mp4h264Out); - cfg->mp4h264Out = NULL; - return res; + C_RESULT res, resVlib, resMp4h264; + resVlib = vlib_stage_decoding_close (cfg->vlibConf); + resMp4h264 = mp4h264_close (cfg->mp4h264Conf); + res = (C_OK == resVlib && C_OK == resMp4h264 ) ? C_OK : C_FAIL; + vp_os_free (cfg->vlibConf); + cfg->vlibConf = NULL; + vp_os_free (cfg->vlibOut); + cfg->vlibOut = NULL; + vp_os_free (cfg->mp4h264Conf); + cfg->mp4h264Conf = NULL; + vp_os_free (cfg->mp4h264Out); + cfg->mp4h264Out = NULL; + return res; } #ifdef USE_ANDROID #define NEONCHECK_BUFFER_STRING_SIZE (512) void checkNeonSupport () { - neon_status_t loc_neonStat = NEON_SUPPORT_FAIL; - FILE *cpuInfo = fopen ("/proc/cpuinfo", "r"); - if (NULL == cpuInfo) + neon_status_t loc_neonStat = NEON_SUPPORT_FAIL; + resetDecoderOnStreamChange = 0; + FILE *cpuInfo = fopen ("/proc/cpuinfo", "r"); + if (NULL == cpuInfo) { - return; + return; } - char *neonCheckStrBuf = vp_os_malloc (NEONCHECK_BUFFER_STRING_SIZE * sizeof (char)); - if (NULL == neonCheckStrBuf) + char *neonCheckStrBuf = vp_os_malloc (NEONCHECK_BUFFER_STRING_SIZE * sizeof (char)); + if (NULL == neonCheckStrBuf) { - fclose (cpuInfo); - return; + fclose (cpuInfo); + return; } - while (NULL != fgets (neonCheckStrBuf, NEONCHECK_BUFFER_STRING_SIZE, cpuInfo)) + while (NULL != fgets (neonCheckStrBuf, NEONCHECK_BUFFER_STRING_SIZE, cpuInfo)) { - char *supportTest = strstr (neonCheckStrBuf, "neon"); - if (NULL != supportTest) + char *supportTest = strstr (neonCheckStrBuf, "neon"); + if (NULL != supportTest) { - loc_neonStat = NEON_SUPPORT_OK; - break; + loc_neonStat = NEON_SUPPORT_OK; + resetDecoderOnStreamChange = 1; + break; } } - - vp_os_free (neonCheckStrBuf); - fclose (cpuInfo); - neonStatus = loc_neonStat; + vp_os_free (neonCheckStrBuf); + neonCheckStrBuf = NULL; + fclose (cpuInfo); + + neonStatus = loc_neonStat; } C_RESULT mp4h264_open (mp4h264_config_t *cfg) { - if (NEON_SUPPORT_UNKNOWN == neonStatus) - checkNeonSupport (); - if (NEON_SUPPORT_OK == neonStatus) - return ittiam_stage_decoding_open (cfg); - else - return ffmpeg_stage_decoding_open (cfg); +#if ITTIAM_SUPPORT + if (NEON_SUPPORT_UNKNOWN == neonStatus) + checkNeonSupport (); + if (NEON_SUPPORT_OK == neonStatus) + return ittiam_stage_decoding_open ((ittiam_stage_decoding_config_t *)cfg); + else +#endif + return ffmpeg_stage_decoding_open (cfg); } C_RESULT mp4h264_transform (mp4h264_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out) { - if (NEON_SUPPORT_UNKNOWN == neonStatus) - checkNeonSupport (); - if (NEON_SUPPORT_OK == neonStatus) - return ittiam_stage_decoding_transform (cfg, in, out); - else - return ffmpeg_stage_decoding_transform (cfg, in, out); +#if ITTIAM_SUPPORT + if (NEON_SUPPORT_UNKNOWN == neonStatus) + checkNeonSupport (); + if (NEON_SUPPORT_OK == neonStatus) + return ittiam_stage_decoding_transform ((ittiam_stage_decoding_config_t *)cfg, in, out); + else +#endif + return ffmpeg_stage_decoding_transform (cfg, in, out); } C_RESULT mp4h264_close (mp4h264_config_t *cfg) { - if (NEON_SUPPORT_UNKNOWN == neonStatus) - checkNeonSupport (); - if (NEON_SUPPORT_OK == neonStatus) - return ittiam_stage_decoding_close (cfg); - else - return ffmpeg_stage_decoding_close (cfg); +#if ITTIAM_SUPPORT + if (NEON_SUPPORT_UNKNOWN == neonStatus) + checkNeonSupport (); + if (NEON_SUPPORT_OK == neonStatus) + return ittiam_stage_decoding_close ((ittiam_stage_decoding_config_t *)cfg); + else +#endif + return ffmpeg_stage_decoding_close (cfg); } #endif diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_decoder.h b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_decoder.h index d4b2b00..a29074d 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_decoder.h +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_decoder.h @@ -11,18 +11,17 @@ #ifndef __VIDEO_STAGE_DECODER_H__ #define __VIDEO_STAGE_DECODER_H__ -#ifndef TARGET_OS_ANDROID -# ifdef ITTIAM_SUPPORT -# define mp4h264_config_t ittiam_stage_decoding_config_t -# include -# else // FFMPEG -# define mp4h264_config_t ffmpeg_stage_decoding_config_t -# endif -#else +#ifdef FFMPEG_SUPPORT # define mp4h264_config_t ffmpeg_stage_decoding_config_t -# include +#elif defined (ITTIAM_SUPPORT) +# define mp4h264_config_t ittiam_stage_decoding_config_t +#else +# error Either FFMPEG_SUPPORT or ITTIAM_SUPPORT must be defined #endif +#ifdef ITTIAM_SUPPORT +# include +#endif #ifdef FFMPEG_SUPPORT # include diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_encoded_recorder.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_encoded_recorder.c index d5d5c98..8a6acc9 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_encoded_recorder.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_encoded_recorder.c @@ -17,10 +17,6 @@ #include -#ifdef USE_ELINUX -#define VIDEO_ENCODED_FILE_DEFAULT_PATH "/data/video/usb/" -#endif - #define VIDEO_ENCODED_RECORDER_VERBOSE (1) #if defined(DEBUG) || VIDEO_ENCODED_RECORDER_VERBOSE @@ -58,468 +54,269 @@ extern char flight_dir[]; #endif const vp_api_stage_funcs_t video_encoded_recorder_funcs = { - (vp_api_stage_handle_msg_t) video_stage_encoded_recorder_handle, - (vp_api_stage_open_t) video_stage_encoded_recorder_open, - (vp_api_stage_transform_t) video_stage_encoded_recorder_transform, - (vp_api_stage_close_t) video_stage_encoded_recorder_close + (vp_api_stage_handle_msg_t) video_stage_encoded_recorder_handle, + (vp_api_stage_open_t) video_stage_encoded_recorder_open, + (vp_api_stage_transform_t) video_stage_encoded_recorder_transform, + (vp_api_stage_close_t) video_stage_encoded_recorder_close }; video_stage_encoded_recorder_config_t video_stage_encoded_recorder_config; -#ifdef USE_ELINUX -DEFINE_THREAD_ROUTINE_STACK(video_stage_encoded_recorder,param,VIDEO_STAGE_ENCODED_RECORDER_STACK_SIZE) -{ - int res; - video_stage_encoded_recorder_config_t *cfg = (video_stage_encoded_recorder_config_t *)param; - video_stage_encoded_recorder_msg_t msg; - char errBuf [50] = {0}; - ardrone_video_error_t vError = ARDRONE_VIDEO_NO_ERROR; - parrot_video_encapsulation_t *PaVE; - //int counter = 0; - /* TODO : check if mutual exclusion with the main thread is needed */ - - while(1) - { - /* Read the address of a new slice to write in the video file */ - res = read(cfg->com_pipe[0],&msg,sizeof(msg)); - - if (res!=sizeof(msg)) { sleep(1); continue; } - - //printf("----> Reading %p %d bytes\n",msg.slice,msg.sliceSize); - PaVE = (parrot_video_encapsulation_t *) msg.slice; - - if (msg.slice!=NULL) - { - /* Create a new MP4 file if necessary */ - if (NULL==cfg->video) - { - cfg->video = ardrone_video_start (cfg->video_filename, cfg->fps, VIDEO_FORMAT, &vError); - if (ARDRONE_VIDEO_SUCCEEDED (vError) && NULL != cfg->video) - { - cfg->currentStreamId = PaVE->stream_id; - } - else - { - VER_PRINT ("An error occured when creating video"); - cfg->startRec=VIDEO_ENCODED_STOPPED; - } - } - - if (NULL!=cfg->video) - { - ardrone_video_error_t vError = ardrone_video_addSlice (cfg->video, msg.slice); - - if (ARDRONE_VIDEO_FAILED (vError)) - { - ardrone_video_error_string (vError, errBuf, 50); - VER_PRINT ("Error while recording frame : %s", errBuf); - ardrone_video_cleanup (&(cfg->video)); - cfg->startRec = VIDEO_ENCODED_STOPPED; - } - if (1 == frameIsLastFrame(msg.slice)) - { - VER_PRINT ("Received last frame for current stream, finishing video\n"); - video_stage_encoded_recorder_finish (cfg); - } - - //counter++; if (counter%16) { sync(); } - } - - /* Free the data bloc which was just written */ - vp_os_free(msg.slice); - } - else /* the data pointer is NULL to signal the end of the recording */ - { - video_stage_encoded_recorder_finish (cfg); - } - - }/*while 1*/ -} -#endif C_RESULT video_stage_encoded_recorder_finish (video_stage_encoded_recorder_config_t *cfg) { - C_RESULT retVal = C_OK; + C_RESULT retVal = C_OK; -#ifndef USE_ELINUX - endRetreiving (); -#endif + endRetreiving (); - cfg->lastStreamId = cfg->currentStreamId; - ardrone_video_error_t vError = ardrone_video_finish (&(cfg->video)); - if (ARDRONE_VIDEO_SUCCEEDED (vError)) + cfg->lastStreamId = cfg->currentStreamId; + ardrone_video_error_t vError = ardrone_video_finish (&(cfg->video)); + if (ARDRONE_VIDEO_SUCCEEDED (vError)) { - VER_PRINT ("Video %s successfully written", cfg->video_filename); + VER_PRINT ("Video %s successfully written", cfg->video_filename); if(cfg->finish_callback != NULL) - cfg->finish_callback((const char *)cfg->video_filename); + cfg->finish_callback((const char *)cfg->video_filename, FALSE); } - else + else { - VER_PRINT ("Error while completing video"); - retVal = C_FAIL; + VER_PRINT ("Error while completing video"); + retVal = C_FAIL; } - // Erase filename - vp_os_memset (cfg->video_filename, 0x0, VIDEO_ENCODED_FILENAME_LENGTH); - cfg->startRec = VIDEO_ENCODED_STOPPED; + // Erase filename + vp_os_memset (cfg->video_filename, 0x0, VIDEO_ENCODED_FILENAME_LENGTH); + cfg->startRec = VIDEO_ENCODED_STOPPED; -#ifdef USE_ELINUX - ardrone_video_system_cleanup(); -#endif - - return retVal; + return retVal; } C_RESULT video_stage_encoded_recorder_handle (video_stage_encoded_recorder_config_t * cfg, PIPELINE_MSG msg_id, void *callback, void *param) { -#ifdef USE_ELINUX - /* Handling the asynchronous mode */ - video_stage_encoded_recorder_msg_t asyn_msg; -#endif + vp_os_mutex_lock (&cfg->videoMutex); - -#ifndef USE_ELINUX - vp_os_mutex_lock (&cfg->videoMutex); -#endif - - void (*recorder_callback)(video_stage_encoded_recorder_config_t*) = callback; - - switch (msg_id) + void (*recorder_callback)(video_stage_encoded_recorder_config_t*) = callback; + + switch (msg_id) { case PIPELINE_MSG_START: // video start - if(cfg->startRec==VIDEO_ENCODED_STOPPED) + if(cfg->startRec==VIDEO_ENCODED_STOPPED) { - time_t t; - char date[ARDRONE_DATE_MAXSIZE]; - ardrone_time2date(*((uint32_t*)param), ARDRONE_FILE_DATE_FORMAT, date); - char media_dirname[VIDEO_ENCODED_FILENAME_LENGTH]; - struct stat statbuf; + cfg->startRec = VIDEO_ENCODED_START_RECORD; + time_t t; + char date[ARDRONE_DATE_MAXSIZE]; + ardrone_time2date(*((uint32_t*)param), ARDRONE_FILE_DATE_FORMAT, date); + char media_dirname[VIDEO_ENCODED_FILENAME_LENGTH]; + struct stat statbuf; - snprintf(media_dirname, VIDEO_ENCODED_FILENAME_LENGTH, "%s/media_%s", VIDEO_ENCODED_FILE_DEFAULT_PATH, date); - if((stat(media_dirname, &statbuf) != 0) && (mkdir(media_dirname, 0777) >= 0)) - VER_PRINT("Create local media directory %s if not exist\n", media_dirname); + snprintf(media_dirname, VIDEO_ENCODED_FILENAME_LENGTH, "%s/media_%s", VIDEO_ENCODED_FILE_DEFAULT_PATH, date); + if((stat(media_dirname, &statbuf) != 0) && (mkdir(media_dirname, 0777) >= 0)) + VER_PRINT("Create local media directory %s if not exist\n", media_dirname); - t = time(NULL); - ardrone_time2date(t, ARDRONE_FILE_DATE_FORMAT, date); + t = time(NULL); + ardrone_time2date(t, ARDRONE_FILE_DATE_FORMAT, date); snprintf(cfg->video_filename, - VIDEO_ENCODED_FILENAME_LENGTH, - "%s/video_%s.%s", - media_dirname, - date, - MOVIE_FILE_EXTENSION); + VIDEO_ENCODED_FILENAME_LENGTH, + "%s/video_%s.%s", + media_dirname, + date, + MOVIE_FILE_EXTENSION); - cfg->startRec = VIDEO_ENCODED_START_RECORD; } - break; + break; case PIPELINE_MSG_STOP: // video stop - if (cfg->startRec==VIDEO_ENCODED_START_RECORD) + if (cfg->startRec==VIDEO_ENCODED_START_RECORD) { - cfg->startRec=VIDEO_ENCODED_STOPPED; + cfg->startRec=VIDEO_ENCODED_STOPPED; } - else if (cfg->startRec==VIDEO_ENCODED_RECORDING) + else if (cfg->startRec==VIDEO_ENCODED_RECORDING) { - cfg->startRec = VIDEO_ENCODED_WAITING_STREAM_END; -#ifndef USE_ELINUX - startRetreiving (); -#endif + cfg->startRec = VIDEO_ENCODED_WAITING_STREAM_END; + startRetreiving (); } - break; + break; case PIPELINE_MSG_SUSPEND: // Force stop - if (cfg->startRec==VIDEO_ENCODED_START_RECORD) + if (cfg->startRec==VIDEO_ENCODED_START_RECORD) { - cfg->startRec=VIDEO_ENCODED_STOPPED; + cfg->startRec=VIDEO_ENCODED_STOPPED; } - else if (cfg->startRec==VIDEO_ENCODED_RECORDING || - cfg->startRec==VIDEO_ENCODED_WAITING_STREAM_END) + else if (cfg->startRec==VIDEO_ENCODED_RECORDING || + cfg->startRec==VIDEO_ENCODED_WAITING_STREAM_END) { -#ifdef USE_ELINUX - if (cfg->use_asynchronous_mode) - { - /* Send an empty slice to the asynchronous thread */ - asyn_msg.sliceSize = 0; - asyn_msg.slice = NULL; - write(cfg->com_pipe[1],&asyn_msg,sizeof(asyn_msg)); - } - else - { -#endif - video_stage_encoded_recorder_finish (cfg); - -#ifdef USE_ELINUX - } -#endif - + video_stage_encoded_recorder_finish (cfg); } - break; - + break; + default: - break; - } - if (recorder_callback!=NULL) { - recorder_callback(cfg); + break; } + if (recorder_callback!=NULL) { + recorder_callback(cfg); + } + + vp_os_mutex_unlock (&cfg->videoMutex); -#ifndef USE_ELINUX - vp_os_mutex_unlock (&cfg->videoMutex); -#endif - - return (VP_SUCCESS); + return (VP_SUCCESS); } bool_t video_stage_encoded_recorder_state(void) { - return (video_stage_encoded_recorder_config.startRec != VIDEO_ENCODED_STOPPED); + return (video_stage_encoded_recorder_config.startRec != VIDEO_ENCODED_STOPPED); } video_encoded_record_state video_stage_encoded_complete_recorder_state (void) { - return video_stage_encoded_recorder_config.startRec; + return video_stage_encoded_recorder_config.startRec; } void video_stage_encoded_recorder_enable(bool_t enable, uint32_t timestamp) { - printf("Recording %s...\n", enable ? "started" : "stopped"); - video_stage_encoded_recorder_handle (&video_stage_encoded_recorder_config, (enable ? PIPELINE_MSG_START : PIPELINE_MSG_STOP), NULL, ×tamp); + printf("Recording %s...\n", enable ? "started" : "stopped"); + video_stage_encoded_recorder_handle (&video_stage_encoded_recorder_config, (enable ? PIPELINE_MSG_START : PIPELINE_MSG_STOP), NULL, ×tamp); } void video_stage_encoded_recorder_com_timeout (void) { - if (VIDEO_ENCODED_WAITING_STREAM_END == video_stage_encoded_recorder_config.startRec) + if (VIDEO_ENCODED_WAITING_STREAM_END == video_stage_encoded_recorder_config.startRec) { - video_stage_encoded_recorder_force_stop (); + video_stage_encoded_recorder_force_stop (); } } void video_stage_encoded_recorder_force_stop (void) { - printf ("Force recording stop\n"); - video_stage_encoded_recorder_handle (&video_stage_encoded_recorder_config, PIPELINE_MSG_SUSPEND, NULL, NULL); + printf ("Force recording stop\n"); + video_stage_encoded_recorder_handle (&video_stage_encoded_recorder_config, PIPELINE_MSG_SUSPEND, NULL, NULL); } C_RESULT video_stage_encoded_recorder_open(video_stage_encoded_recorder_config_t *cfg) { - if (0 == cfg->fps) + if (0 == cfg->fps) { - cfg->fps = 30; + cfg->fps = 30; } - cfg->startRec=VIDEO_ENCODED_STOPPED; - cfg->lastStreamId = UINT16_MAX; - cfg->currentStreamId = UINT16_MAX; + cfg->startRec=VIDEO_ENCODED_STOPPED; + cfg->lastStreamId = UINT16_MAX; + cfg->currentStreamId = UINT16_MAX; - cfg->video = NULL; + cfg->video = NULL; -#ifndef USE_ELINUX - vp_os_mutex_init (&cfg->videoMutex); - ardrone_video_remove_all (VIDEO_ENCODED_FILE_DEFAULT_PATH); -#endif -#ifdef USE_ELINUX - if (cfg->use_asynchronous_mode){ - /* Create a pipe to send video slices to the recording thread */ - pipe((int*)(&cfg->com_pipe)); + vp_os_mutex_init (&cfg->videoMutex); + ardrone_video_remove_all (VIDEO_ENCODED_FILE_DEFAULT_PATH); - /* Create the above-mentioned thread */ - vp_os_thread_create(thread_video_stage_encoded_recorder, - (void*)cfg, - &cfg->thread_handle, - cfg->thread_priority, - "VideoFlashRec", - (void*)stack_video_stage_encoded_recorder, - sizeof(stack_video_stage_encoded_recorder), - &cfg->thread ); - } -#endif - - return C_OK; + return C_OK; } int frameIsLastFrame (uint8_t *data) { - int retVal = 0; - if (PAVE_CHECK (data)) + int retVal = 0; + if (PAVE_CHECK (data)) { - parrot_video_encapsulation_t *PaVE = (parrot_video_encapsulation_t *)data; - if (PAVE_CTRL_LAST_FRAME_IN_STREAM & PaVE->control) + parrot_video_encapsulation_t *PaVE = (parrot_video_encapsulation_t *)data; + if (PAVE_CTRL_LAST_FRAME_IN_STREAM & PaVE->control) { - retVal = 1; + retVal = 1; } } - return retVal; + return retVal; } -#ifdef USE_ELINUX -int ardrone_video_usb_key_get_free_space(void); -#endif C_RESULT video_stage_encoded_recorder_transform(video_stage_encoded_recorder_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out) { -#ifdef USE_ELINUX - /* Handling the asynchronous mode */ - video_stage_encoded_recorder_msg_t asyn_msg; -#endif + vp_os_mutex_lock (&out->lock); + vp_os_mutex_lock (&cfg->videoMutex); - vp_os_mutex_lock (&out->lock); - -#ifndef USE_ELINUX - vp_os_mutex_lock (&cfg->videoMutex); -#endif - - // Copy in to out - if (NULL != in && NULL != out) + // Copy in to out + if (NULL != in && NULL != out) { - out->numBuffers = in->numBuffers; - out->indexBuffer = in->indexBuffer; - out->lineSize = in->lineSize; - out->size = in->size; - out->status = in->status; - out->buffers = in->buffers; - out->status = VP_API_STATUS_PROCESSING; + out->numBuffers = in->numBuffers; + out->indexBuffer = in->indexBuffer; + out->lineSize = in->lineSize; + out->size = in->size; + out->status = in->status; + out->buffers = in->buffers; + out->status = VP_API_STATUS_PROCESSING; } + -#ifdef USE_ELINUX - /* The drone pipeline may call the recorder with an empty input */ + uint8_t *slice = in->buffers[in->indexBuffer]; + parrot_video_encapsulation_t *PaVE = (parrot_video_encapsulation_t *)slice; - if (NULL==in || NULL==in->buffers || in->size<1) { vp_os_mutex_unlock (&out->lock); return C_OK; } -#endif - - uint8_t *slice = in->buffers[in->indexBuffer]; - parrot_video_encapsulation_t *PaVE = (parrot_video_encapsulation_t *)slice; - - if (cfg->lastStreamId == PaVE->stream_id) + if (cfg->lastStreamId == PaVE->stream_id) { - VER_PRINT ("Got a video slice from an old stream, skipping\n"); -#ifndef USE_ELINUX - vp_os_mutex_unlock (&cfg->videoMutex); -#endif - vp_os_mutex_unlock (&out->lock); - return C_OK; + VER_PRINT ("Got a video slice from an old stream, skipping\n"); + vp_os_mutex_unlock (&cfg->videoMutex); + vp_os_mutex_unlock (&out->lock); + return C_OK; } - - if(cfg->startRec == VIDEO_ENCODED_START_RECORD) + + if(cfg->startRec == VIDEO_ENCODED_START_RECORD) { - ardrone_video_error_t vError = ARDRONE_VIDEO_NO_ERROR; + ardrone_video_error_t vError = ARDRONE_VIDEO_NO_ERROR; -#ifdef USE_ELINUX - /* Determine the amount of video data we can store */ - cfg->quota = ardrone_video_usb_key_get_free_space() /* kbytes */ - ( 100 * 1024 ); /* Keep 100 megabytes free */ - if(cfg->quota<0) { cfg->quota = 0; } - printf("Flash video recording : available space : %dkb (time est. %d\'%d\") - (keeping a 100Mb margin on %s)\n", - cfg->quota,(cfg->quota>>10)/60,(cfg->quota>>10)%60, - VIDEO_ENCODED_FILE_DEFAULT_PATH); - if (cfg->use_asynchronous_mode) + cfg->video = ardrone_video_start (cfg->video_filename, cfg->fps, VIDEO_FORMAT, &vError); + if (ARDRONE_VIDEO_SUCCEEDED (vError) && NULL != cfg->video) { - cfg->startRec=VIDEO_ENCODED_RECORDING; + cfg->startRec=VIDEO_ENCODED_RECORDING; + cfg->currentStreamId = PaVE->stream_id; } - else{ -#endif - - cfg->video = ardrone_video_start (cfg->video_filename, cfg->fps, VIDEO_FORMAT, &vError); - if (ARDRONE_VIDEO_SUCCEEDED (vError) && NULL != cfg->video) - { - cfg->startRec=VIDEO_ENCODED_RECORDING; - cfg->currentStreamId = PaVE->stream_id; - } - else - { - VER_PRINT ("An error occured when creating video"); - cfg->startRec=VIDEO_ENCODED_STOPPED; - } - -#ifdef USE_ELINUX + else + { + VER_PRINT ("An error occured when creating video"); + cfg->startRec=VIDEO_ENCODED_STOPPED; } -#endif - } - if((cfg->startRec == VIDEO_ENCODED_RECORDING) || - (cfg->startRec == VIDEO_ENCODED_WAITING_STREAM_END)) + if((cfg->startRec == VIDEO_ENCODED_RECORDING) || + (cfg->startRec == VIDEO_ENCODED_WAITING_STREAM_END)) { #if USE_LINUX - /* Quick and dirty debugging inside AR.Drone Navigation */ - if (PAVE_CHECK(slice)) - { - parrot_video_encapsulation_t * pave = (parrot_video_encapsulation_t*) slice; - printf("Recording frame %dx%d num %d \n\033[1A",pave->display_width,pave->display_height,pave->frame_number); - if (pave->control & PAVE_CTRL_LAST_FRAME_IN_STREAM) { - printf("\n\nEnd of stream PaVE received !\n\n"); - } - } + /* Quick and dirty debugging inside AR.Drone Navigation */ + if (PAVE_CHECK(slice)) + { + parrot_video_encapsulation_t * pave = (parrot_video_encapsulation_t*) slice; + printf("Recording frame %dx%d num %d \n\033[1A",pave->display_width,pave->display_height,pave->frame_number); + if (pave->control & PAVE_CTRL_LAST_FRAME_IN_STREAM) { + printf("\n\nEnd of stream PaVE received !\n\n"); + } + } #endif - -#ifdef USE_ELINUX - if (( ( in->size /*bytes*/ ) >>10 ) > cfg->quota ) + ardrone_video_error_t vError = ardrone_video_addSlice (cfg->video, slice); + if (ARDRONE_VIDEO_FAILED (vError)) { - printf("Flash video recording : out of disk space.\n"); - cfg->startRec=VIDEO_ENCODED_STOPPED; + char errBuf [50] = {0}; + ardrone_video_error_string (vError, errBuf, 50); + VER_PRINT ("Error while recording frame : %s", errBuf); + ardrone_video_cleanup (&(cfg->video)); + cfg->startRec = VIDEO_ENCODED_STOPPED; } - else + + if (1 == frameIsLastFrame (slice)) { - cfg->quota /*kbytes*/ -= ( ( in->size /*bytes*/ ) >>10 ); - navdata_set_hdvideo_usbkey_freespace(cfg->quota); - - if (cfg->use_asynchronous_mode) - { - /* Create a RAM buffer to hold a temporary copy of the slice to write */ - asyn_msg.sliceSize = in->size; - asyn_msg.slice = vp_os_malloc(asyn_msg.sliceSize); - if (asyn_msg.slice){ - vp_os_memcpy(asyn_msg.slice,slice,asyn_msg.sliceSize); - /* Send the copy to thread which does the actual writing */ - //printf("----> Writing %p %d bytes\n",asyn_msg.slice,asyn_msg.sliceSize); - write(cfg->com_pipe[1],&asyn_msg,sizeof(asyn_msg)); - } - else - { - printf("Flash video recording : out of RAM - dropping frame.\n"); - } - } - else - { -#endif - - - - ardrone_video_error_t vError = ardrone_video_addSlice (cfg->video, slice); - if (ARDRONE_VIDEO_FAILED (vError)) - { - char errBuf [50] = {0}; - ardrone_video_error_string (vError, errBuf, 50); - VER_PRINT ("Error while recording frame : %s", errBuf); - ardrone_video_cleanup (&(cfg->video)); - cfg->startRec = VIDEO_ENCODED_STOPPED; - } - - if (1 == frameIsLastFrame (slice)) - { - VER_PRINT ("Received last frame for current stream, finishing video\n"); - video_stage_encoded_recorder_finish (cfg); - } - -#ifdef USE_ELINUX - } + VER_PRINT ("Received last frame for current stream, finishing video\n"); + video_stage_encoded_recorder_finish (cfg); } -#endif + } -#ifndef USE_ELINUX - vp_os_mutex_unlock (&cfg->videoMutex); -#endif - vp_os_mutex_unlock (&out->lock); - return C_OK; + vp_os_mutex_unlock (&cfg->videoMutex); + vp_os_mutex_unlock (&out->lock); + return C_OK; } C_RESULT video_stage_encoded_recorder_close(video_stage_encoded_recorder_config_t *cfg) { - if (NULL != cfg->video) + if (NULL != cfg->video) { - ardrone_video_finish (&(cfg->video)); + ardrone_video_finish (&(cfg->video)); } - return C_OK; + return C_OK; } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_encoded_recorder.h b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_encoded_recorder.h index 0a84f91..79381c6 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_encoded_recorder.h +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_encoded_recorder.h @@ -18,7 +18,7 @@ typedef enum } video_encoded_record_state; #endif -typedef void (*video_stage_encoded_recorder_callback)(const char *mediaPath); +typedef void (*video_stage_encoded_recorder_callback)(const char *mediaPath, bool_t addToQueue); typedef struct _video_stage_encoded_recorder_config_t { diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_ffmpeg_decoder.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_ffmpeg_decoder.c index 84b1617..b8cd1cc 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_ffmpeg_decoder.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_ffmpeg_decoder.c @@ -214,19 +214,18 @@ void ffmpeg_decoder_dumpPave (parrot_video_encapsulation_t *PaVE) static inline bool_t check_and_copy_PaVE (parrot_video_encapsulation_t *PaVE, vp_api_io_data_t *data, parrot_video_encapsulation_t *prevPaVE, bool_t *dimChanged) { + parrot_video_encapsulation_t *localPaVE = (parrot_video_encapsulation_t *)data->buffers[data->indexBuffer]; if (localPaVE->signature[0] == 'P' && localPaVE->signature[1] == 'a' && localPaVE->signature[2] == 'V' && localPaVE->signature[3] == 'E') - { + { //FFMPEG_DEBUG("Found a PaVE"); vp_os_memcpy (prevPaVE, PaVE, sizeof (parrot_video_encapsulation_t)); // Make a backup of previous PaVE so we can check if things have changed vp_os_memcpy (PaVE, localPaVE, sizeof (parrot_video_encapsulation_t)); // Copy PaVE to our local one - - #if __FFMPEG_DEBUG_ENABLED printf ("------------------------------------\n"); printf ("PREV : "); @@ -291,7 +290,8 @@ C_RESULT ffmpeg_stage_decoding_transform(ffmpeg_stage_decoding_config_t *cfg, vp int frameFinished = 0; bool_t frameDimChanged = FALSE; - static parrot_video_encapsulation_t PaVE, prevPaVE; + static parrot_video_encapsulation_t __attribute__ ((aligned (4))) PaVE; + static parrot_video_encapsulation_t __attribute__ ((aligned (4))) prevPaVE; #if WAIT_FOR_I_FRAME static bool_t waitForIFrame = TRUE; @@ -300,7 +300,7 @@ C_RESULT ffmpeg_stage_decoding_transform(ffmpeg_stage_decoding_config_t *cfg, vp #ifdef NUM_SAMPLES static struct timeval start_time, start_time2; static int numsamples = 0; -#endif +#endif if (0 == in->size) // No frame { @@ -387,6 +387,7 @@ C_RESULT ffmpeg_stage_decoding_transform(ffmpeg_stage_decoding_config_t *cfg, vp } #endif + if(out->status == VP_API_STATUS_PROCESSING && (!waitForIFrame || (PaVE.frame_type == FRAME_TYPE_IDR_FRAME) || (PaVE.frame_type == FRAME_TYPE_I_FRAME))) // Processing code { waitForIFrame = FALSE; @@ -398,6 +399,7 @@ C_RESULT ffmpeg_stage_decoding_transform(ffmpeg_stage_decoding_config_t *cfg, vp packet.data = ((unsigned char*)in->buffers[in->indexBuffer]); packet.size = in->size; FFMPEG_DEBUG("Size : %d", packet.size); + #ifdef NUM_SAMPLES struct timeval end_time; @@ -443,6 +445,11 @@ C_RESULT ffmpeg_stage_decoding_transform(ffmpeg_stage_decoding_config_t *cfg, vp } else { + /* Skip frames are usually 7 bytes long + * and make FFMPEG return an error. It is however normal to get + * skip frames from the drone. + */ + if (7!=PaVE.payload_size) printf ("Decoding failed for a %s\n", (PaVE.frame_type == FRAME_TYPE_P_FRAME) ? "P Frame" : "I Frame"); } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_ittiam_decoder.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_ittiam_decoder.c index e745a72..98c1221 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_ittiam_decoder.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_ittiam_decoder.c @@ -795,7 +795,9 @@ C_RESULT ittiam_stage_decoding_close(ittiam_stage_decoding_config_t *cfg) { } vp_os_free(h264_mem_rec); + h264_mem_rec = NULL; vp_os_free(h264_ps_it_mem); + h264_ps_it_mem = NULL; } else if (current_PaVE.video_codec == CODEC_MPEG4_VISUAL) { //MPEG4 @@ -820,7 +822,9 @@ C_RESULT ittiam_stage_decoding_close(ittiam_stage_decoding_config_t *cfg) { } vp_os_free(mpeg4_mem_rec); + mpeg4_mem_rec = NULL; vp_os_free(mpeg4_ps_it_mem); + mpeg4_ps_it_mem = NULL; } old_num_frame = cfg->num_picture_decoded; ITTIAM_DEBUG_PRINT("ITTIAM CLEAN"); diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_tcp.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_tcp.c index 4efe3c9..6d7a72a 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_tcp.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/video_stage_tcp.c @@ -404,7 +404,10 @@ C_RESULT video_stage_tcp_transform(video_stage_tcp_config_t *cfg, vp_api_io_data C_RESULT video_stage_tcp_close(video_stage_tcp_config_t *cfg) { vp_os_free (cfg->bufferPointer); + cfg->bufferPointer = NULL; vp_os_free (cfg->globalBuffer); + cfg->globalBuffer = NULL; vp_os_free (cfg->frameBuffer); + cfg->frameBuffer = NULL; return C_OK; } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/Video/vlib_stage_decode.c b/ARDroneLib/Soft/Lib/ardrone_tool/Video/vlib_stage_decode.c index 7d8f5a5..a0e195e 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/Video/vlib_stage_decode.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/Video/vlib_stage_decode.c @@ -18,6 +18,7 @@ C_RESULT vlib_stage_decoding_open(vlib_stage_decoding_config_t *cfg) video_controller_set_format( &cfg->controller, ACQ_WIDTH, ACQ_HEIGHT ); vp_os_free( cfg->controller.in_stream.bytes ); + cfg->controller.in_stream.bytes = NULL; return C_OK; } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool.c b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool.c index b1e5501..8466d4c 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool.c @@ -275,7 +275,7 @@ C_RESULT ardrone_tool_shutdown() ardrone_navdata_client_shutdown(); ardrone_control_shutdown(); ardrone_tool_input_shutdown(); - + JOIN_THREAD(ardrone_control); JOIN_THREAD(navdata_update); @@ -332,14 +332,11 @@ int ardrone_tool_main(int argc, char **argv) argc--; argv++; } - // Making the driver ROS compatible -/* if( show_usage || (argc != 0) ) { ardrone_tool_usage( appname ); exit(-1); } -*/ /* After a first analysis, the arguments are restored so they can be passed to the user-defined functions */ argc=argc_backup; @@ -351,7 +348,6 @@ int ardrone_tool_main(int argc, char **argv) { PRINT("You have to install new locales in your dev environment! (avoid the need of conv_coma_to_dot)\n"); PRINT("As root, do a \"dpkg-reconfigure locales\" and add en_GB.UTF8 to your locale settings\n"); - PRINT("If you have any problem, feel free to contact Pierre Eline (pierre.eline@parrot.com)\n"); } else { @@ -407,10 +403,12 @@ int ardrone_tool_main(int argc, char **argv) appname = &argv[0][lastSlashPos+1]; ardrone_gen_appid (appname, __SDK_VERSION__, app_id, app_name, sizeof (app_name)); res = ardrone_tool_init(wifi_ardrone_ip, strlen(wifi_ardrone_ip), NULL, appname, NULL, NULL, NULL, MAX_FLIGHT_STORING_SIZE, NULL); + while( SUCCEED(res) && ardrone_tool_exit() == FALSE ) { res = ardrone_tool_update(); } + res = ardrone_tool_shutdown(); } diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool.h b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool.h index 93005ec..a081c9a 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool.h +++ b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool.h @@ -66,7 +66,7 @@ C_RESULT ardrone_tool_shutdown(void); void ardrone_tool_init_timers_and_mutex(); void ardrone_tool_send_com_watchdog(void); // To send it only once -//int main(); +int main(); // There because not defined in embedded void api_configuration_get_ctrl_mode(void); diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool_configuration.c b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool_configuration.c index 8bc3d09..6f26ef0 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool_configuration.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_tool_configuration.c @@ -226,9 +226,15 @@ static void ardrone_tool_configuration_event_configure_end(struct _ardrone_contr } if (NULL!=ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].value) + { vp_os_free(ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].value); + ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].value = NULL; + } if (NULL!=ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].event) + { vp_os_free(ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].event); + ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].event = NULL; + } ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].event = NULL; ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].value = NULL; ardrone_tool_configuration_current_index = (ardrone_tool_configuration_current_index + 1) % ARDRONE_TOOL_CONFIGURATION_MAX_EVENT; @@ -269,7 +275,9 @@ static void ardrone_tool_configuration_event_configure(void) ardrone_control_ack_event_t *event = NULL; if (ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].callback) + { ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].callback(ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].value, ses_id, usr_id, app_id); + } if(ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].event == NULL) ardrone_tool_configuration_data[ardrone_tool_configuration_current_index].event = vp_os_malloc(sizeof(ardrone_control_ack_event_t)); diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_version.c b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_version.c index d3f3ed9..408541e 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_version.c +++ b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_version.c @@ -6,6 +6,8 @@ #include +#ifndef USE_ELINUX + int compareVersions (ardrone_version_t *v1, ardrone_version_t *v2) { @@ -53,6 +55,7 @@ getDroneVersion (const char *tempPath, const char *droneIp, ardrone_version_t *v if (FTP_FAILED (status)) { vp_os_free (localName); + localName = NULL; ftpClose (&ftp); return -1; } @@ -64,6 +67,7 @@ getDroneVersion (const char *tempPath, const char *droneIp, ardrone_version_t *v { remove (localName); vp_os_free (localName); + localName = NULL; return -1; } @@ -73,12 +77,14 @@ getDroneVersion (const char *tempPath, const char *droneIp, ardrone_version_t *v fclose (versionFile); remove (localName); vp_os_free (localName); + localName = NULL; return -1; } fclose (versionFile); remove (localName); vp_os_free (localName); + localName = NULL; version->majorVersion = maj; version->minorVersion = min; @@ -86,3 +92,5 @@ getDroneVersion (const char *tempPath, const char *droneIp, ardrone_version_t *v return 0; } + +#endif diff --git a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_version.h b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_version.h index 8675ee8..a3dda28 100644 --- a/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_version.h +++ b/ARDroneLib/Soft/Lib/ardrone_tool/ardrone_version.h @@ -59,6 +59,8 @@ int getDroneVersion (const char *tempPath, const char *droneIp, ardrone_version_ # define ARDRONE_VERSION() 1 # endif +#define getDroneVersion(...) ARDRONE_VERSION() + #endif #define IS_ARDRONE1 (1 == ARDRONE_VERSION()) // Drone 1 diff --git a/ARDroneLib/Soft/Lib/utils/ardrone_ftp.c b/ARDroneLib/Soft/Lib/utils/ardrone_ftp.c index e775561..6eec7c4 100644 --- a/ARDroneLib/Soft/Lib/utils/ardrone_ftp.c +++ b/ARDroneLib/Soft/Lib/utils/ardrone_ftp.c @@ -21,6 +21,8 @@ #include +#include + /* CONFIGURATION */ // All following macros MUST be defined ! @@ -28,7 +30,7 @@ // To deactivate, define to (0) #ifdef DEBUG // Debug options -#define _FTP_DEBUG (1) // Common debug informations +#define _FTP_DEBUG (0) // Common debug informations #define _FTP_VERBOSE (0) // Extended debug information (many outputs on ftpList) #define _FTP_ERRORS_PRINT (1) // Display of error messages #else // Release options @@ -43,48 +45,48 @@ #if _FTP_ERRORS_PRINT #define FTP_ERROR(...) \ - do \ + do \ { \ - fprintf (stderr, "Error in function %s at line %d : ", __FUNCTION__, __LINE__); \ - fprintf (stderr, __VA_ARGS__); \ - char *errorBuffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); \ - if (NULL != errorBuffer) \ + PRINT ("Error in function %s at line %d : ", __FUNCTION__, __LINE__); \ + PRINT (__VA_ARGS__); \ + char *errorBuffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); \ + if (NULL != errorBuffer) \ { \ - snprintf (errorBuffer, COMMAND_BUFFER_SIZE-1, __VA_ARGS__); \ - FTPlastErrorMessageSize = strlen (errorBuffer) + 1; \ - FTPlastErrorMessage = vp_os_realloc (FTPlastErrorMessage, FTPlastErrorMessageSize); \ - if (NULL != FTPlastErrorMessage) \ + snprintf (errorBuffer, COMMAND_BUFFER_SIZE-1, __VA_ARGS__); \ + FTPlastErrorMessageSize = strlen (errorBuffer) + 1; \ + FTPlastErrorMessage = vp_os_realloc (FTPlastErrorMessage, FTPlastErrorMessageSize); \ + if (NULL != FTPlastErrorMessage) \ { \ - strncpy (FTPlastErrorMessage, errorBuffer, FTPlastErrorMessageSize); \ + strncpy (FTPlastErrorMessage, errorBuffer, FTPlastErrorMessageSize); \ } \ - vp_os_free (errorBuffer); \ + vp_os_free (errorBuffer); \ } \ } while (0) #else #define FTP_ERROR(...) \ - do \ + do \ { \ - char *errorBuffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); \ - if (NULL != errorBuffer) \ + char *errorBuffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); \ + if (NULL != errorBuffer) \ { \ - snprintf (errorBuffer, COMMAND_BUFFER_SIZE-1, __VA_ARGS__); \ - FTPlastErrorMessageSize = strlen (errorBuffer) + 1; \ - FTPlastErrorMessage = vp_os_realloc (FTPlastErrorMessage, FTPlastErrorMessageSize); \ - if (NULL != FTPlastErrorMessage) \ + snprintf (errorBuffer, COMMAND_BUFFER_SIZE-1, __VA_ARGS__); \ + FTPlastErrorMessageSize = strlen (errorBuffer) + 1; \ + FTPlastErrorMessage = vp_os_realloc (FTPlastErrorMessage, FTPlastErrorMessageSize); \ + if (NULL != FTPlastErrorMessage) \ { \ - strncpy (FTPlastErrorMessage, errorBuffer, FTPlastErrorMessageSize); \ + strncpy (FTPlastErrorMessage, errorBuffer, FTPlastErrorMessageSize); \ } \ - vp_os_free (errorBuffer); \ + vp_os_free (errorBuffer); \ } \ } while (0) #endif #if _FTP_DEBUG #define FTP_DEBUG(...) \ - do \ + do \ { \ - printf ("Debug from function %s at line %d : ", __FUNCTION__, __LINE__); \ - printf (__VA_ARGS__); \ + PRINT ("Debug from function %s at line %d : ", __FUNCTION__, __LINE__); \ + PRINT (__VA_ARGS__); \ } while (0) #else #define FTP_DEBUG(...) @@ -92,10 +94,10 @@ #if _FTP_VERBOSE #define FTP_PRINT(...) \ - do \ + do \ { \ - printf (FTP_PREFIX); \ - printf (__VA_ARGS__); \ + PRINT (FTP_PREFIX); \ + PRINT (__VA_ARGS__); \ } while (0) #else #define FTP_PRINT(...) @@ -116,7 +118,7 @@ /* TIMEOUT MACROS */ /* Total socket timeout : SOCK_TO_SEC + SOCK_TO_USEC */ -#define SOCK_TO_SEC 1 // Socket timeout (seconds) +#define SOCK_TO_SEC 3 // Socket timeout (seconds) #define SOCK_TO_USEC 0 // Socket timeout (useconds) /* GLOBAL ERROR MESSAGE STRING */ @@ -131,33 +133,34 @@ typedef struct _ftp_put_param_s _ftp_put_param; struct _ftp_put_param_s { - _ftp_t *ftp; - char localName [FILE_NAME_MAX_SIZE]; - char remoteName [FILE_NAME_MAX_SIZE]; - int useResume; - ftp_callback callback; - char *fileList; + _ftp_t *ftp; + char localName [FILE_NAME_MAX_SIZE]; + char remoteName [FILE_NAME_MAX_SIZE]; + int useResume; + ftp_callback callback; + char *fileList; }; struct _ftp_get_param_s { - _ftp_t *ftp; - char localName [FILE_NAME_MAX_SIZE]; - char remoteName [FILE_NAME_MAX_SIZE]; - int useResume; - ftp_callback callback; - char *fileList; + _ftp_t *ftp; + char localName [FILE_NAME_MAX_SIZE]; + char remoteName [FILE_NAME_MAX_SIZE]; + int useResume; + ftp_callback callback; + char *fileList; }; struct _ftp_list_param_s { - _ftp_t *ftp; - char *fileList; - int listSize; - ftp_callback callback; + _ftp_t *ftp; + char *fileList; + int listSize; + ftp_callback callback; }; /* LOCAL FUNCTIONS PROTOTYPES */ +int isLANIp (const char *ip); void emptyCallback (_ftp_status status, void *arg, _ftp_t *callingFtp); _ftp_status waitFor226Answer (_ftp_t *ftp); int setSockTimeout (int socket, int timeoutSec, int timeoutUsec); @@ -166,7 +169,7 @@ void flushFtp (_ftp_t *ftp); int getFileSize (_ftp_t *ftp, const char *distPath); int getLocalFileSize (const char *localPath); int getResponseCode (const char *response); -_ftp_status getPassiveIpAndPort (const char *response, char *ip, int *port, int ipLen); +_ftp_status getPassiveIpAndPort (_ftp_t *ftp, const char *response, char *ip, int *port, int ipLen); _ftp_status ftpTransfert (_ftp_t *ftp, const char *message, char *answer, int answSize); _ftp_status ftpSend (_ftp_t *ftp, const char *message); _ftp_status ftpRecv (_ftp_t *ftp, char *answer, int answSize); @@ -175,23 +178,59 @@ DEFINE_THREAD_ROUTINE (ftpPut, param); DEFINE_THREAD_ROUTINE (ftpList, param); /* FUNCTIONS IMPLEMENTATION */ +int +isLANIp (const char *ip) +{ + int retVal = -1; + uint32_t ip0, ip1, ip2, ip3; + if (4 == sscanf (ip, "%u.%u.%u.%u", &ip0, &ip1, &ip2, &ip3)) + { + /* LAN address classes : + * 127.x.x.x + * 10.x.x.x + * 192.168.x.x + * 169.254.x.x + * 172.[16-31].x.x + * + * Test IP is : + * ip0.ip1.ip2.ip3 + */ + if (((127 == ip0)) || + ((10 == ip0)) || + ((192 == ip0) && (168 == ip1)) || + ((169 == ip0) && (254 == ip1)) || + ((172 == ip0) && (16 <= ip1) && (31 >= ip1))) + { + retVal = 1; + } + else + { + retVal = 0; + } + } + else + { + FTP_ERROR ("String %s does not represent a valid ipv4 address\n", ip); + } + return retVal; +} void emptyCallback (_ftp_status status, void *arg, _ftp_t *callingFtp) { - FTP_PRINT ("Called with status %d\n", status); + FTP_PRINT ("Called with status %d\n", status); #if _FTP_VERBOSE - if (FTP_PROGRESS == status) + if (FTP_PROGRESS == status) { - FTP_PRINT ("Trying float arg : %f\n", (NULL != arg) ? *(float *)arg : -1.0); + FTP_PRINT ("Trying float arg : %f\n", (NULL != arg) ? *(float *)arg : -1.0); } #endif - if (NULL != callingFtp) + if (NULL != callingFtp) { - callingFtp->lastStatus = status; - if(FTP_SUCCESS == status && NULL != arg) + callingFtp->lastStatus = status; + if(FTP_SUCCESS == status && NULL != arg) { - callingFtp->lastFileList = (char *)arg; + callingFtp->lastFileList = (char *)arg; } } } @@ -200,444 +239,459 @@ emptyCallback (_ftp_status status, void *arg, _ftp_t *callingFtp) _ftp_status waitFor226Answer (_ftp_t *ftp) { - char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == srvMsg) + char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == srvMsg) { - return FTP_FAIL; + return FTP_FAIL; } - int repCode = 0; - int numretries = FTP_MAX_NUM_RETRIES; + int repCode = 0; + int numretries = FTP_MAX_NUM_RETRIES; - _ftp_status ftp_result = FTP_SUCCESS; - while (226 != repCode && 0 < numretries) + _ftp_status ftp_result = FTP_SUCCESS; + while (226 != repCode && 0 < numretries) { - ftp_result = ftpRecv (ftp, srvMsg, MAX_SIZE_MSG-1); - numretries--; - repCode = getResponseCode (srvMsg); + ftp_result = ftpRecv (ftp, srvMsg, MAX_SIZE_MSG-1); + numretries--; + repCode = getResponseCode (srvMsg); } - vp_os_free (srvMsg); - return ftp_result; + vp_os_free (srvMsg); + return ftp_result; } int setSockTimeout (int socket, int timeoutSec, int timeoutUsec) { #ifdef _WIN32 - int winTO = (1000 * timeoutSec) + (timeoutUsec / 1000); + int winTO = (1000 * timeoutSec) + (timeoutUsec / 1000); #else - struct timeval posixTO; - posixTO.tv_sec = timeoutSec; - posixTO.tv_usec = timeoutUsec; + struct timeval posixTO; + posixTO.tv_sec = timeoutSec; + posixTO.tv_usec = timeoutUsec; #endif - if (0 > setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, + if (0 > setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, #ifdef _WIN32 - (const char *)&winTO, sizeof (winTO) + (const char *)&winTO, sizeof (winTO) #else - (const char *)&posixTO, sizeof (posixTO) + (const char *)&posixTO, sizeof (posixTO) #endif - )) + )) { - FTP_ERROR ("Unable to set recv timeout\n"); - return -1; + FTP_ERROR ("Unable to set recv timeout\n"); + return -1; } - if (0 > setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, + if (0 > setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, #ifdef _WIN32 - (const char *)&winTO, sizeof (winTO) + (const char *)&winTO, sizeof (winTO) #else - (const char *)&posixTO, sizeof (posixTO) + (const char *)&posixTO, sizeof (posixTO) #endif - )) + )) { - FTP_ERROR ("Unable to set send timeout\n"); - return -1; + FTP_ERROR ("Unable to set send timeout\n"); + return -1; } - return 0; + return 0; } _ftp_status goToBinaryMode (_ftp_t *ftp) { - char *ftpAnswer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - if (NULL == ftpAnswer) + char *ftpAnswer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + if (NULL == ftpAnswer) { - return FTP_FAIL; + return FTP_FAIL; } - _ftp_status ftp_result = ftpTransfert (ftp, "TYPE I\r\n\0", ftpAnswer, COMMAND_BUFFER_SIZE-1); - if (FTP_FAILED (ftp_result)) + _ftp_status ftp_result = ftpTransfert (ftp, "TYPE I\r\n\0", ftpAnswer, COMMAND_BUFFER_SIZE-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Unable to go to binary mode\n"); + FTP_ERROR ("Unable to go to binary mode\n"); } - vp_os_free (ftpAnswer); - return ftp_result; + vp_os_free (ftpAnswer); + return ftp_result; } void flushFtp (_ftp_t *ftp) { - FTP_DEBUG ("Starting flush\n"); - char c = 0; - int bytes = 1; - int flushedBytes = 0; - VP_COM_SOCKET_BLOCKING_OPTIONS oldOptions = ftp->socket->block; - ftp->socket->block = VP_COM_DONTWAIT; - C_RESULT vp_result = ftp->readSock (ftp->socket, (uint8_t *)&c, &bytes); - while (0 < bytes && VP_SUCCEEDED (vp_result)) + FTP_DEBUG ("Starting flush\n"); + char c = 0; + int bytes = 1; + int flushedBytes = 0; + VP_COM_SOCKET_BLOCKING_OPTIONS oldOptions = ftp->socket->block; + ftp->socket->block = VP_COM_DONTWAIT; + C_RESULT vp_result = ftp->readSock (ftp->socket, (uint8_t *)&c, &bytes); + while (0 < bytes && VP_SUCCEEDED (vp_result)) { - flushedBytes++; + flushedBytes++; #if _FTP_DEBUG - printf ("%c", c); + printf ("%c", c); #endif - vp_result = ftp->readSock (ftp->socket, (uint8_t *)&c, &bytes); + vp_result = ftp->readSock (ftp->socket, (uint8_t *)&c, &bytes); } - FTP_DEBUG ("Flushed %d bytes\n", flushedBytes); - ftp->socket->block = oldOptions; + FTP_DEBUG ("Flushed %d bytes\n", flushedBytes); + ftp->socket->block = oldOptions; } int getFileSize (_ftp_t *ftp, const char *distPath) { - char *ftpCommand = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - char *ftpAnswer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - if (NULL == ftpCommand || NULL == ftpAnswer) + char *ftpCommand = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + char *ftpAnswer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + if (NULL == ftpCommand || NULL == ftpAnswer) { - vp_os_free (ftpCommand); - vp_os_free (ftpAnswer); - return -1; + vp_os_free (ftpCommand); + vp_os_free (ftpAnswer); + return -1; } - snprintf (ftpCommand, COMMAND_BUFFER_SIZE-1, "SIZE %s\r\n", distPath); - _ftp_status ftp_result = ftpTransfert (ftp, ftpCommand, ftpAnswer, COMMAND_BUFFER_SIZE-1); - if (FTP_FAILED (ftp_result)) + snprintf (ftpCommand, COMMAND_BUFFER_SIZE-1, "SIZE %s\r\n", distPath); + _ftp_status ftp_result = ftpTransfert (ftp, ftpCommand, ftpAnswer, COMMAND_BUFFER_SIZE-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Unable to get file size\n"); - vp_os_free (ftpCommand); - vp_os_free (ftpAnswer); - return -1; + FTP_ERROR ("Unable to get file size\n"); + vp_os_free (ftpCommand); + vp_os_free (ftpAnswer); + return -1; } - int size = -1; - int repCode = 0; - sscanf (ftpAnswer, "%d %d", &repCode, &size); - vp_os_free (ftpCommand); - vp_os_free (ftpAnswer); - return size; + int size = -1; + int repCode = 0; + sscanf (ftpAnswer, "%d %d", &repCode, &size); + vp_os_free (ftpCommand); + vp_os_free (ftpAnswer); + return size; } int getLocalFileSize (const char *localPath) { - FILE *localFile = fopen (localPath, "r"); - if (NULL == localFile) + FILE *localFile = fopen (localPath, "r"); + if (NULL == localFile) { - FTP_DEBUG ("File %s does not exist\n", localPath); - return -1; + FTP_DEBUG ("File %s does not exist\n", localPath); + return -1; } - fseek (localFile, 0, SEEK_END); - int size = (int)ftell (localFile); - FTP_DEBUG ("Size of file %s : %d o\n", localPath, size); - fclose (localFile); - return size; + fseek (localFile, 0, SEEK_END); + int size = (int)ftell (localFile); + FTP_DEBUG ("Size of file %s : %d o\n", localPath, size); + fclose (localFile); + return size; } int getResponseCode (const char *response) { - int retVal = -1; - sscanf (response, "%d", &retVal); - return retVal; + int retVal = -1; + sscanf (response, "%d", &retVal); + return retVal; } _ftp_status -getPassiveIpAndPort (const char *response, char *ip, int *port, int ipLen) +getPassiveIpAndPort (_ftp_t *ftp, const char *response, char *ip, int *port, int ipLen) { - int ip1, ip2, ip3, ip4, port1, port2; - int indexOfFirstIpField = 0; - char atIndex = '\0'; - int maxIndex = strlen (response); - while (indexOfFirstIpField < maxIndex && '(' != atIndex) + int ip1, ip2, ip3, ip4, port1, port2; + int indexOfFirstIpField = 0; + char atIndex = '\0'; + int maxIndex = strlen (response); + while (indexOfFirstIpField < maxIndex && '(' != atIndex) { - atIndex = response[indexOfFirstIpField++]; + atIndex = response[indexOfFirstIpField++]; } - int numread = sscanf (&response[indexOfFirstIpField], "%d,%d,%d,%d,%d,%d)", &ip1, &ip2, &ip3, &ip4, &port1, &port2); - _ftp_status result = FTP_SUCCESS; - if (6 == numread) + int numread = sscanf (&response[indexOfFirstIpField], "%d,%d,%d,%d,%d,%d)", &ip1, &ip2, &ip3, &ip4, &port1, &port2); + _ftp_status result = FTP_SUCCESS; + if (6 == numread) { - snprintf (ip, ipLen-1, "%d.%d.%d.%d", ip1, ip2, ip3, ip4); - *port = 256 * port1 + port2; - FTP_DEBUG ("IP : %s | Port : %d\n", ip, *port); + snprintf (ip, ipLen-1, "%d.%d.%d.%d", ip1, ip2, ip3, ip4); + *port = 256 * port1 + port2; + FTP_DEBUG ("IP : %s | Port : %d\n", ip, *port); } - else + else { - result = FTP_FAIL; + result = FTP_FAIL; } - return result; + int pasvIsLan = isLANIp (ip); + int servIsLan = isLANIp (ftp->socket->serverHost); + if (-1 == pasvIsLan || -1 == servIsLan) + { + // Error while parsing IP ... + result = FTP_FAIL; + } + else if (1 == pasvIsLan && 0 == servIsLan) + { + FTP_DEBUG ("pasv ip is a LAN ip (not routable), but server ip is not a LAN ip. We'll use the server ip (%s) instead of the pasv ip (%s)\n", ftp->socket->serverHost, ip); + strncpy (ip, ftp->socket->serverHost, ipLen); + } + // No else : if pasv addr is routable or if both address are LAN address, keep pasv ip. + + return result; } _ftp_status ftpTransfert (_ftp_t *ftp, const char *message, char *answer, int answSize) { - flushFtp (ftp); - _ftp_status ftp_result = ftpSend (ftp, message); - if (FTP_FAILED (ftp_result)) + flushFtp (ftp); + _ftp_status ftp_result = ftpSend (ftp, message); + if (FTP_FAILED (ftp_result)) { - return ftp_result; + return ftp_result; } - return ftpRecv (ftp, answer, answSize); + return ftpRecv (ftp, answer, answSize); } _ftp_status ftpSend (_ftp_t *ftp, const char *message) { - if (NULL == ftp) + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); - return FTP_FAIL; + FTP_ERROR ("FTP not open\n"); + return FTP_FAIL; } - FTP_DEBUG ("Sending %sto FTP at %s:%d\n", message, ftp->socket->serverHost, ftp->socket->port); + FTP_DEBUG ("Sending %sto FTP at %s:%d\n", message, ftp->socket->serverHost, ftp->socket->port); - int bytes = strlen (message); - C_RESULT vp_result = ftp->writeSock (ftp->socket, (uint8_t *)message, &bytes); - if (VP_FAILED (vp_result)) + int bytes = strlen (message); + C_RESULT vp_result = ftp->writeSock (ftp->socket, (uint8_t *)message, &bytes); + if (VP_FAILED (vp_result)) { - FTP_ERROR ("Error while sending data\n"); - return FTP_FAIL; + FTP_ERROR ("Error while sending data\n"); + return FTP_FAIL; } - if (0 == bytes) + if (0 == bytes) { - FTP_ERROR ("Unable to send data\n"); - return FTP_TIMEOUT; + FTP_ERROR ("Unable to send data\n"); + return FTP_TIMEOUT; } - return FTP_SUCCESS; + return FTP_SUCCESS; } _ftp_status ftpRecv (_ftp_t *ftp, char *answer, int answSize) { - if (NULL == ftp) + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); - return FTP_FAIL; + FTP_ERROR ("FTP not open\n"); + return FTP_FAIL; } - vp_os_memset (answer, 0x0, answSize); - int index = 0; - do + vp_os_memset (answer, 0x0, answSize); + int index = 0; + do { - int bytes = 1; - C_RESULT vp_result = ftp->readSock (ftp->socket, (uint8_t *)(&answer [index]), &bytes); - if (VP_FAILED (vp_result)) + int bytes = 1; + C_RESULT vp_result = ftp->readSock (ftp->socket, (uint8_t *)(&answer [index]), &bytes); + if (VP_FAILED (vp_result)) { - FTP_ERROR ("Error while reading data\n"); - return FTP_FAIL; + FTP_ERROR ("Error while reading data\n"); + return FTP_FAIL; } - if (0 == bytes) + if (0 == bytes) { - FTP_ERROR ("Recv timeout\n"); - return FTP_TIMEOUT; + FTP_ERROR ("Recv timeout\n"); + return FTP_TIMEOUT; } } - while (index < answSize && '\n' != answer [index++]); + while (index < answSize && '\n' != answer [index++]); - FTP_DEBUG ("Answer:\n<---START--->\n%s\n<---END--->\n", answer); - return FTP_SUCCESS; + FTP_DEBUG ("Answer:\n<---START--->\n%s\n<---END--->\n", answer); + return FTP_SUCCESS; } _ftp_status ftpClose (_ftp_t **ftp) { - FTP_DEBUG ("Closing ftp\n"); - _ftp_status retVal = FTP_FAIL; - if (NULL != *ftp) + FTP_DEBUG ("Closing ftp\n"); + _ftp_status retVal = FTP_FAIL; + if (NULL != *ftp) { - FTP_DEBUG ("Not null ftp\n"); - if (NULL != (*ftp)->socket) + FTP_DEBUG ("Not null ftp\n"); + if (NULL != (*ftp)->socket) { - FTP_DEBUG ("Not null socket\n"); - if (1 == (*ftp)->connected) + FTP_DEBUG ("Not null socket\n"); + if (1 == (*ftp)->connected) { - if (FTP_SUCCESS == ftpAbort ((*ftp))) // An operation was in progress, abort and let time to cleanup. + if (FTP_SUCCESS == ftpAbort ((*ftp))) // An operation was in progress, abort and let time to cleanup. { - usleep (100000); // 100ms + usleep (100000); // 100ms } - ftpSend ((*ftp), "QUIT\r\n\0"); - (*ftp)->connected = 0; + ftpSend ((*ftp), "QUIT\r\n\0"); + (*ftp)->connected = 0; } - vp_com_close_socket ((*ftp)->socket); - vp_os_free ((*ftp)->socket); - (*ftp)->socket = NULL; - retVal = FTP_SUCCESS; + vp_com_close_socket ((*ftp)->socket); + vp_os_free ((*ftp)->socket); + (*ftp)->socket = NULL; + retVal = FTP_SUCCESS; } - vp_os_free (*ftp); - *ftp = NULL; + vp_os_free (*ftp); + *ftp = NULL; } - return retVal; + return retVal; } _ftp_t * ftpConnectFromName (const char *name, int port, const char *username, const char *password, _ftp_status *status) { - struct hostent *hostent = gethostbyname(name); - return ftpConnect(inet_ntoa( *( struct in_addr*)( hostent->h_addr)), port, username, password, status); + struct hostent *hostent = gethostbyname(name); + return ftpConnect(inet_ntoa( *( struct in_addr*)( hostent->h_addr)), port, username, password, status); } _ftp_t * ftpConnect (const char *ip, int port, const char *username, const char *password, _ftp_status *status) { - if (NULL == ip || - NULL == username || - NULL == password || - NULL == status) + if (NULL == ip || + NULL == username || + NULL == password || + NULL == status) { - FTP_ERROR ("Must not pass NULL pointers to ftpConnect\n"); - if (NULL != status) { *status = FTP_FAIL; } - return NULL; + FTP_ERROR ("Must not pass NULL pointers to ftpConnect\n"); + if (NULL != status) { *status = FTP_FAIL; } + return NULL; } - int isAnonymous = ((0 == strcmp (username, "anonymous")) || (0 == strcmp (username, ""))) ? 1 : 0; - if (1 == isAnonymous) + int isAnonymous = ((0 == strcmp (username, "anonymous")) || (0 == strcmp (username, ""))) ? 1 : 0; + if (1 == isAnonymous) { - FTP_DEBUG ("Connecting to %s:%d, anonymous\n", ip, port); + FTP_DEBUG ("Connecting to %s:%d, anonymous\n", ip, port); } - else + else { - FTP_DEBUG ("Connecting to %s:%d, USER = %s, Password = %s\n", ip, port, username, password); + FTP_DEBUG ("Connecting to %s:%d, USER = %s, Password = %s\n", ip, port, username, password); } - *status = FTP_FAIL; - _ftp_t *retFtp = vp_os_malloc (sizeof (_ftp_t)); - if (NULL == retFtp) + *status = FTP_FAIL; + _ftp_t *retFtp = vp_os_malloc (sizeof (_ftp_t)); + if (NULL == retFtp) { - FTP_ERROR ("Unable to allocate a ftp structure\n"); - return NULL; + FTP_ERROR ("Unable to allocate a ftp structure\n"); + return NULL; } - retFtp->lastStatus = FTP_SUCCESS; - retFtp->lastFileList = NULL; + retFtp->lastStatus = FTP_SUCCESS; + retFtp->lastFileList = NULL; - retFtp->socket = vp_os_malloc (sizeof (vp_com_socket_t)); - if (NULL == retFtp->socket) + retFtp->socket = vp_os_malloc (sizeof (vp_com_socket_t)); + if (NULL == retFtp->socket) { - FTP_ERROR ("Unable to allocate socket filed of the ftp structure\n"); - ftpClose (&retFtp); - return NULL; + FTP_ERROR ("Unable to allocate socket filed of the ftp structure\n"); + ftpClose (&retFtp); + return NULL; } - retFtp->connected = 0; + retFtp->connected = 0; - retFtp->socket->type = VP_COM_CLIENT; - retFtp->socket->protocol = VP_COM_TCP; - retFtp->socket->port = port; - strncpy (retFtp->socket->serverHost, ip, VP_COM_NAME_MAXSIZE-1); - retFtp->socket->is_multicast = 0; - retFtp->socket->block = VP_COM_DEFAULT; + retFtp->socket->type = VP_COM_CLIENT; + retFtp->socket->protocol = VP_COM_TCP; + retFtp->socket->port = port; + strncpy (retFtp->socket->serverHost, ip, VP_COM_NAME_MAXSIZE-1); + retFtp->socket->is_multicast = 0; + retFtp->socket->block = VP_COM_DEFAULT; - C_RESULT vp_result = vp_com_open_socket (retFtp->socket, &(retFtp->readSock), &(retFtp->writeSock)); - if (VP_FAILED (vp_result)) + C_RESULT vp_result = vp_com_open_socket (retFtp->socket, &(retFtp->readSock), &(retFtp->writeSock)); + if (VP_FAILED (vp_result)) { - FTP_ERROR ("Unable to connect\n"); - ftpClose (&retFtp); - return NULL; + FTP_ERROR ("Unable to connect\n"); + ftpClose (&retFtp); + return NULL; } - int result = setSockTimeout ((int)retFtp->socket->priv, SOCK_TO_SEC, SOCK_TO_USEC); - if (0 > result) + int result = setSockTimeout ((int)retFtp->socket->priv, SOCK_TO_SEC, SOCK_TO_USEC); + if (0 > result) { - FTP_ERROR ("Unable to set socket timeout\n"); - ftpClose (&retFtp); - return NULL; + FTP_ERROR ("Unable to set socket timeout\n"); + ftpClose (&retFtp); + return NULL; } - char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == srvMsg) + char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == srvMsg) { - FTP_ERROR ("Unable to allocate buffer\n"); - ftpClose (&retFtp); - return NULL; + FTP_ERROR ("Unable to allocate buffer\n"); + ftpClose (&retFtp); + return NULL; } - if (FTP_FAILED (ftpRecv (retFtp, srvMsg, MAX_SIZE_MSG-1))) + if (FTP_FAILED (ftpRecv (retFtp, srvMsg, MAX_SIZE_MSG-1))) { - FTP_ERROR ("Unable to recieve data from server\n"); - ftpClose (&retFtp); - vp_os_free (srvMsg); - return NULL; + FTP_ERROR ("Unable to recieve data from server\n"); + ftpClose (&retFtp); + vp_os_free (srvMsg); + return NULL; } - int repCode = getResponseCode (srvMsg); - if (220 != repCode) + int repCode = getResponseCode (srvMsg); + if (220 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 220)\n", repCode); - ftpClose (&retFtp); - vp_os_free (srvMsg); - return NULL; + FTP_ERROR ("Bad response from server (%d, expected 220)\n", repCode); + ftpClose (&retFtp); + vp_os_free (srvMsg); + return NULL; } - char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - if (NULL == buffer) + char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + if (NULL == buffer) { - FTP_ERROR ("Unable to allocate buffer\n"); - ftpClose (&retFtp); - vp_os_free (srvMsg); - return NULL; + FTP_ERROR ("Unable to allocate buffer\n"); + ftpClose (&retFtp); + vp_os_free (srvMsg); + return NULL; } - if (1 == isAnonymous) + if (1 == isAnonymous) { - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "USER anonymous\r\n"); + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "USER anonymous\r\n"); } - else + else { - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "USER %s\r\n", username); + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "USER %s\r\n", username); } - if (FTP_FAILED (ftpTransfert (retFtp, buffer, srvMsg, MAX_SIZE_MSG-1))) + if (FTP_FAILED (ftpTransfert (retFtp, buffer, srvMsg, MAX_SIZE_MSG-1))) { - FTP_ERROR ("Error while sending command\n"); - ftpClose (&retFtp); - vp_os_free (srvMsg); - vp_os_free (buffer); - return NULL; + FTP_ERROR ("Error while sending command\n"); + ftpClose (&retFtp); + vp_os_free (srvMsg); + vp_os_free (buffer); + return NULL; } - repCode = getResponseCode (srvMsg); - int goodRepCode = 331; - if (1 == isAnonymous) + repCode = getResponseCode (srvMsg); + int goodRepCode = 331; + if (1 == isAnonymous) { - goodRepCode = 230; + goodRepCode = 230; } - if (goodRepCode != repCode) + if (goodRepCode != repCode) { - FTP_ERROR ("Bad response from server (%d, expected %d)\n", repCode, goodRepCode); - ftpClose (&retFtp); - vp_os_free (srvMsg); - vp_os_free (buffer); - return NULL; + FTP_ERROR ("Bad response from server (%d, expected %d)\n", repCode, goodRepCode); + ftpClose (&retFtp); + vp_os_free (srvMsg); + vp_os_free (buffer); + return NULL; } - if (0 == isAnonymous) + if (0 == isAnonymous) { - vp_os_memset (buffer, 0x0, COMMAND_BUFFER_SIZE); - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "PASS %s\r\n", password); - if (FTP_FAILED (ftpTransfert (retFtp, buffer, srvMsg, MAX_SIZE_MSG-1))) + vp_os_memset (buffer, 0x0, COMMAND_BUFFER_SIZE); + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "PASS %s\r\n", password); + if (FTP_FAILED (ftpTransfert (retFtp, buffer, srvMsg, MAX_SIZE_MSG-1))) { - FTP_ERROR ("Error while sending command\n"); - ftpClose (&retFtp); - vp_os_free (srvMsg); - vp_os_free (buffer); - return NULL; + FTP_ERROR ("Error while sending command\n"); + ftpClose (&retFtp); + vp_os_free (srvMsg); + vp_os_free (buffer); + return NULL; } - repCode = getResponseCode (srvMsg); - if (230 != repCode) + repCode = getResponseCode (srvMsg); + if (230 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 230)\n", repCode); - ftpClose (&retFtp); - vp_os_free (srvMsg); - vp_os_free (buffer); - return NULL; + FTP_ERROR ("Bad response from server (%d, expected 230)\n", repCode); + ftpClose (&retFtp); + vp_os_free (srvMsg); + vp_os_free (buffer); + return NULL; } } - *status = FTP_SUCCESS; - retFtp->connected = 1; - retFtp->opInProgress = 0; - retFtp->abortCurrentOp = 0; - vp_os_free (srvMsg); - vp_os_free (buffer); - return retFtp; + *status = FTP_SUCCESS; + retFtp->connected = 1; + retFtp->opInProgress = 0; + retFtp->abortCurrentOp = 0; + retFtp->tag = NULL; + vp_os_free (srvMsg); + vp_os_free (buffer); + return retFtp; } @@ -645,1181 +699,1193 @@ ftpConnect (const char *ip, int port, const char *username, const char *password #define CLEAN_PARAMS(status) CLEAN_PARAMS_WITH_ARG(status,NULL) #undef CLEAN_PARAMS_WITH_ARG #define CLEAN_PARAMS_WITH_ARG(status,arg) \ - do \ + do \ { \ - if (NULL != params->ftp) \ + if (NULL != params->ftp) \ { \ - params->ftp->opInProgress = 0; \ + params->ftp->opInProgress = 0; \ } \ - CLEAN_PARAMS_ABORT (status,arg); \ + CLEAN_PARAMS_ABORT (status,arg); \ } while (0) #undef CLEAN_PARAMS_ABORT #define CLEAN_PARAMS_ABORT(status,arg) \ - do \ + do \ { \ - _ftp_status locStat = (status); \ - if (NULL != localFile) fclose (localFile); \ - if (NULL != srvMsg) vp_os_free (srvMsg); \ - if (NULL != buffer) vp_os_free (buffer); \ - if (NULL != filePart) vp_os_free (filePart); \ - if (NULL != dataSocket) \ + _ftp_status locStat = (status); \ + if (NULL != localFile) fclose (localFile); \ + if (NULL != srvMsg) vp_os_free (srvMsg); \ + if (NULL != buffer) vp_os_free (buffer); \ + if (NULL != filePart) vp_os_free (filePart); \ + if (NULL != dataSocket) \ { \ - vp_com_close_socket (dataSocket); \ - vp_os_free (dataSocket); \ - dataSocket = NULL; \ + vp_com_close_socket (dataSocket); \ + vp_os_free (dataSocket); \ + dataSocket = NULL; \ } \ - params->callback (locStat, arg, params->ftp); \ - if (FTP_SUCCESS != status && NULL != params->fileList) \ + params->callback (locStat, arg, params->ftp); \ + if (FTP_SUCCESS != status && NULL != params->fileList) \ { \ - vp_os_free (params->fileList); \ - params->fileList = NULL; \ + vp_os_free (params->fileList); \ + params->fileList = NULL; \ } \ - vp_os_free (param); \ - FTP_DEBUG ("Returning from thread %s with status %d\n", __FUNCTION__, locStat); \ - THREAD_RETURN (locStat); \ + vp_os_free (param); \ + FTP_DEBUG ("Returning from thread %s with status %d\n", __FUNCTION__, locStat); \ + THREAD_RETURN (locStat); \ } \ - while (0) + while (0) #undef CHECK_ABORT #define CHECK_ABORT \ - do \ + do \ { \ - if (1 <= params->ftp->abortCurrentOp) \ + if (1 <= params->ftp->abortCurrentOp) \ { \ - vp_os_memset (srvMsg, 0x0, MAX_SIZE_MSG); \ - if (NULL != dataSocket) \ + vp_os_memset (srvMsg, 0x0, MAX_SIZE_MSG); \ + if (NULL != dataSocket) \ { \ - vp_com_close_socket (dataSocket); \ - vp_os_free (dataSocket); \ - dataSocket = NULL; \ + vp_com_close_socket (dataSocket); \ + vp_os_free (dataSocket); \ + dataSocket = NULL; \ } \ - ftpTransfert (params->ftp, "ABOR\r\n\0", srvMsg, MAX_SIZE_MSG-1); \ - flushFtp (params->ftp); \ - params->ftp->abortCurrentOp = 0; \ - params->ftp->opInProgress = 0; \ - CLEAN_PARAMS_ABORT (FTP_ABORT, NULL); \ + ftpTransfert (params->ftp, "ABOR\r\n\0", srvMsg, MAX_SIZE_MSG-1); \ + flushFtp (params->ftp); \ + params->ftp->abortCurrentOp = 0; \ + params->ftp->opInProgress = 0; \ + CLEAN_PARAMS_ABORT (FTP_ABORT, NULL); \ } \ } while (0) DEFINE_THREAD_ROUTINE (ftpList, param) { - char *srvMsg = NULL; - char *buffer = NULL; // Compatibility with macros - char *filePart = NULL; // Compatibility with macros - FILE *localFile = NULL; // Compatibilty with macros - vp_com_socket_t *dataSocket = NULL; - Read dataRead = NULL; - Write dataWrite = NULL; - _ftp_list_param *params = (_ftp_list_param *)param; - if (NULL == params->ftp) + char *srvMsg = NULL; + char *buffer = NULL; // Compatibility with macros + char *filePart = NULL; // Compatibility with macros + FILE *localFile = NULL; // Compatibilty with macros + vp_com_socket_t *dataSocket = NULL; + Read dataRead = NULL; + Write dataWrite = NULL; + _ftp_list_param *params = (_ftp_list_param *)param; + if (NULL == params->ftp) { - FTP_ERROR ("FTP not open\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("FTP not open\n"); + CLEAN_PARAMS (FTP_FAIL); } - flushFtp (params->ftp); - - srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == srvMsg) + flushFtp (params->ftp); + + srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == srvMsg) { - FTP_ERROR ("Unable to allocate buffer\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to allocate buffer\n"); + CLEAN_PARAMS (FTP_FAIL); } - _ftp_status ftp_result = ftpTransfert (params->ftp, "PASV\r\n\0", srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + _ftp_status ftp_result = ftpTransfert (params->ftp, "PASV\r\n\0", srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending command\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Error while sending command\n"); + CLEAN_PARAMS (ftp_result); } - int repCode = getResponseCode (srvMsg); - if (227 != repCode) + int repCode = getResponseCode (srvMsg); + if (227 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 227)\n", repCode); - CLEAN_PARAMS (FTP_FAIL); - } - - char dataIp [IP_STRING_SIZE] = {0}; - int dataPort = 0; - getPassiveIpAndPort (srvMsg, dataIp, &dataPort, IP_STRING_SIZE); - - FTP_DEBUG ("Thread will connect to %s:%d\n", dataIp, dataPort); - dataSocket = vp_os_malloc (sizeof (vp_com_socket_t)); - if (NULL == dataSocket) - { - FTP_ERROR ("Unable to allocate socket structure\n"); - CLEAN_PARAMS (FTP_FAIL); - } - dataSocket->type = VP_COM_CLIENT; - dataSocket->protocol = VP_COM_TCP; - dataSocket->port = dataPort; - strncpy (dataSocket->serverHost, dataIp, VP_COM_NAME_MAXSIZE); - dataSocket->is_multicast = 0; - dataSocket->block = VP_COM_WAITALL; - - C_RESULT vp_result = vp_com_open_socket (dataSocket, &dataRead, &dataWrite); - if (VP_FAILED (vp_result)) - { - FTP_ERROR ("Unable to connect\n"); - CLEAN_PARAMS (FTP_FAIL); - } - - int result = setSockTimeout ((int)dataSocket->priv, SOCK_TO_SEC, SOCK_TO_USEC); - if (0 > result) - { - FTP_ERROR ("Unable to set data socket timeout\n"); - CLEAN_PARAMS (FTP_FAIL); - } - - CHECK_ABORT; - - ftp_result = ftpSend (params->ftp, "LIST\r\n\0"); - if (FTP_FAILED (ftp_result)) - { - FTP_ERROR ("Error while sending LIST command\n"); - CLEAN_PARAMS (ftp_result); - } - - CHECK_ABORT; - char ftpData [2] = {0}; - int bytes = 1, totalBytes; - vp_os_memset (params->fileList, 0x0, params->listSize); - vp_result = dataRead (dataSocket, (uint8_t *)ftpData, &bytes); - if (VP_FAILED (vp_result)) - { - FTP_ERROR ("Unable to receive data\n"); - CLEAN_PARAMS (FTP_FAIL); - } - if(0 == bytes) - { - FTP_DEBUG ("Empty folder\n"); - waitFor226Answer (params->ftp); - flushFtp (params->ftp); - CLEAN_PARAMS (FTP_SAMESIZE); + FTP_ERROR ("Bad response from server (%d, expected 227)\n", repCode); + CLEAN_PARAMS (FTP_FAIL); } - if (strlen (ftpData) > params->listSize - 1) + char dataIp [IP_STRING_SIZE] = {0}; + int dataPort = 0; + getPassiveIpAndPort (params->ftp, srvMsg, dataIp, &dataPort, IP_STRING_SIZE); + + FTP_DEBUG ("Thread will connect to %s:%d\n", dataIp, dataPort); + dataSocket = vp_os_malloc (sizeof (vp_com_socket_t)); + if (NULL == dataSocket) { - params->listSize += LIST_BUFFER_BLOCKSIZE; - params->fileList = vp_os_realloc(params->fileList, params->listSize); - if(NULL == params->fileList) + FTP_ERROR ("Unable to allocate socket structure\n"); + CLEAN_PARAMS (FTP_FAIL); + } + dataSocket->type = VP_COM_CLIENT; + dataSocket->protocol = VP_COM_TCP; + dataSocket->port = dataPort; + strncpy (dataSocket->serverHost, dataIp, VP_COM_NAME_MAXSIZE); + dataSocket->is_multicast = 0; + dataSocket->block = VP_COM_WAITALL; + + C_RESULT vp_result = vp_com_open_socket (dataSocket, &dataRead, &dataWrite); + if (VP_FAILED (vp_result)) + { + FTP_ERROR ("Unable to connect\n"); + CLEAN_PARAMS (FTP_FAIL); + } + + int result = setSockTimeout ((int)dataSocket->priv, SOCK_TO_SEC, SOCK_TO_USEC); + if (0 > result) + { + FTP_ERROR ("Unable to set data socket timeout\n"); + CLEAN_PARAMS (FTP_FAIL); + } + + CHECK_ABORT; + + ftp_result = ftpSend (params->ftp, "LIST\r\n\0"); + if (FTP_FAILED (ftp_result)) + { + FTP_ERROR ("Error while sending LIST command\n"); + CLEAN_PARAMS (ftp_result); + } + + CHECK_ABORT; + char ftpData [2] = {0}; + int bytes = 1, totalBytes; + vp_os_memset (params->fileList, 0x0, params->listSize); + vp_result = dataRead (dataSocket, (uint8_t *)ftpData, &bytes); + if (VP_FAILED (vp_result)) + { + FTP_ERROR ("Unable to receive data\n"); + CLEAN_PARAMS (FTP_FAIL); + } + if(0 == bytes) + { + FTP_DEBUG ("Empty folder\n"); + waitFor226Answer (params->ftp); + flushFtp (params->ftp); + CLEAN_PARAMS (FTP_SAMESIZE); + } + + if (strlen (ftpData) > params->listSize - 1) + { + params->listSize += LIST_BUFFER_BLOCKSIZE; + params->fileList = vp_os_realloc(params->fileList, params->listSize); + if(NULL == params->fileList) { - FTP_ERROR ("Not enough space in response string, can't reallocate buffer list\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Not enough space in response string, can't reallocate buffer list\n"); + CLEAN_PARAMS (FTP_FAIL); } } - snprintf (params->fileList, params->listSize-1, "%s", ftpData); - totalBytes = bytes; - while (1) // Loop is killed by a return or a break statement + snprintf (params->fileList, params->listSize-1, "%s", ftpData); + totalBytes = bytes; + while (1) // Loop is killed by a return or a break statement { - CHECK_ABORT; - ftpData [0] = 0; - bytes = 1; - vp_result = dataRead (dataSocket, (uint8_t *)ftpData, &bytes); - if (VP_FAILED (vp_result)) + CHECK_ABORT; + ftpData [0] = 0; + bytes = 1; + vp_result = dataRead (dataSocket, (uint8_t *)ftpData, &bytes); + if (VP_FAILED (vp_result)) { - FTP_ERROR ("Unable to receive data\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to receive data\n"); + CLEAN_PARAMS (FTP_FAIL); } - if (0 == bytes && '\n' == params->fileList [totalBytes-1]) + if (0 == bytes && '\n' == params->fileList [totalBytes-1]) { - FTP_DEBUG ("Got all listing !\n"); - // Timeouted. We got all the listing ! - // Timeout is voluntary, so still return FTP_SUCCESS - break; + FTP_DEBUG ("Got all listing !\n"); + // Timeouted. We got all the listing ! + // Timeout is voluntary, so still return FTP_SUCCESS + break; } - else if (0 == bytes) + else if (0 == bytes) { - // Timeout - FTP_ERROR ("Recv timeout\n"); - CLEAN_PARAMS (FTP_TIMEOUT); + // Timeout + FTP_ERROR ("Recv timeout\n"); + CLEAN_PARAMS (FTP_TIMEOUT); } - if (strlen (ftpData) > (params->listSize - 1 - strlen (params->fileList))) + if (strlen (ftpData) > (params->listSize - 1 - strlen (params->fileList))) { - params->listSize += LIST_BUFFER_BLOCKSIZE; - params->fileList = vp_os_realloc(params->fileList, params->listSize); - if(NULL == params->fileList) + params->listSize += LIST_BUFFER_BLOCKSIZE; + params->fileList = vp_os_realloc(params->fileList, params->listSize); + if(NULL == params->fileList) { - FTP_ERROR ("Not enough space in response string, can't reallocate buffer list\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Not enough space in response string, can't reallocate buffer list\n"); + CLEAN_PARAMS (FTP_FAIL); } } - strcat (params->fileList, ftpData); - totalBytes += bytes; - FTP_PRINT ("Progress of listing : finished ? %d : (%d->%d bytes) %s\n", (params->response [totalBytes -1] == '\n') ? 1: 0, bytes, totalBytes, params->response); + strcat (params->fileList, ftpData); + totalBytes += bytes; + FTP_PRINT ("Progress of listing : finished ? %d : (%d->%d bytes) %s\n", (params->response [totalBytes -1] == '\n') ? 1: 0, bytes, totalBytes, params->response); } - ftp_result = ftpRecv (params->ftp, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + ftp_result = ftpRecv (params->ftp, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while getting answer\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Error while getting answer\n"); + CLEAN_PARAMS (ftp_result); } - repCode = getResponseCode (srvMsg); - if (150 != repCode) + repCode = getResponseCode (srvMsg); + if (150 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 150)\n", repCode); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Bad response from server (%d, expected 150)\n", repCode); + CLEAN_PARAMS (FTP_FAIL); } - /* Cleaning FTP */ - if (NULL != dataSocket) + /* Cleaning FTP */ + if (NULL != dataSocket) { - vp_com_close_socket (dataSocket); - vp_os_free (dataSocket); - dataSocket = NULL; + vp_com_close_socket (dataSocket); + vp_os_free (dataSocket); + dataSocket = NULL; } - _ftp_status loc226Status = waitFor226Answer (params->ftp); - flushFtp (params->ftp); + _ftp_status loc226Status = waitFor226Answer (params->ftp); + flushFtp (params->ftp); - CLEAN_PARAMS_WITH_ARG (loc226Status, (void *)params->fileList); + CLEAN_PARAMS_WITH_ARG (loc226Status, (void *)params->fileList); } DEFINE_THREAD_ROUTINE (ftpGet, param) { - char *srvMsg = NULL; - char *buffer = NULL; - char *filePart = NULL; - vp_com_socket_t *dataSocket = NULL; - Read dataRead = NULL; - Write dataWrite = NULL; - FILE *localFile = NULL; - _ftp_get_param *params = (_ftp_get_param *)param; - FTP_DEBUG ("Downloading %s to %s [resume : %c]\n", params->remoteName, params->localName, params->useResume ? 'y' : 'n'); - if (NULL == params->ftp) + char *srvMsg = NULL; + char *buffer = NULL; + char *filePart = NULL; + vp_com_socket_t *dataSocket = NULL; + Read dataRead = NULL; + Write dataWrite = NULL; + FILE *localFile = NULL; + _ftp_get_param *params = (_ftp_get_param *)param; + FTP_DEBUG ("Downloading %s to %s [resume : %c]\n", params->remoteName, params->localName, params->useResume ? 'y' : 'n'); + if (NULL == params->ftp) { - FTP_ERROR ("FTP not open\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("FTP not open\n"); + CLEAN_PARAMS (FTP_FAIL); } - flushFtp (params->ftp); + flushFtp (params->ftp); - buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - if (NULL == buffer) + buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + if (NULL == buffer) { - FTP_ERROR ("Unable to alloc buffer\n"); - CLEAN_PARAMS (FTP_FAIL); - } - srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == srvMsg) - { - FTP_ERROR ("Unable to alloc buffer\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to alloc buffer\n"); + CLEAN_PARAMS (FTP_FAIL); } - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "PASV\r\n"); - _ftp_status ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == srvMsg) { - FTP_ERROR ("Error while entering passive mode\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Unable to alloc buffer\n"); + CLEAN_PARAMS (FTP_FAIL); } - int repCode = getResponseCode (srvMsg); - if (227 != repCode) + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "PASV\r\n"); + _ftp_status ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Bad response from server (%d, expected 227)\n", repCode); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Error while entering passive mode\n"); + CLEAN_PARAMS (ftp_result); + } + int repCode = getResponseCode (srvMsg); + if (227 != repCode) + { + FTP_ERROR ("Bad response from server (%d, expected 227)\n", repCode); + CLEAN_PARAMS (FTP_FAIL); } - char dataIp [IP_STRING_SIZE] = {0}; - int dataPort = 0; - getPassiveIpAndPort (srvMsg, dataIp, &dataPort, IP_STRING_SIZE); - - ftp_result = goToBinaryMode (params->ftp); - if (FTP_FAILED (ftp_result)) - { - FTP_ERROR ("Unable to go to binary mode\n"); - CLEAN_PARAMS (ftp_result); - } + char dataIp [IP_STRING_SIZE] = {0}; + int dataPort = 0; + getPassiveIpAndPort (params->ftp, srvMsg, dataIp, &dataPort, IP_STRING_SIZE); - int fileSize = getFileSize (params->ftp, params->remoteName); - if (0 >= fileSize) + ftp_result = goToBinaryMode (params->ftp); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("File %s does not exist on server\n", params->remoteName); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to go to binary mode\n"); + CLEAN_PARAMS (ftp_result); } - int sizeToGet = fileSize; - int localFileSize = getLocalFileSize (params->localName); - int appendToFile = params->useResume; - int appendOffset = 0; - if (-1 == localFileSize && 1 == params->useResume) + + int fileSize = getFileSize (params->ftp, params->remoteName); + if (0 > fileSize) { - FTP_DEBUG ("File does not exist ... full download\n"); - appendToFile = 0; + FTP_ERROR ("File %s does not exist on server\n", params->remoteName); + CLEAN_PARAMS (FTP_FAIL); } - if (1 == appendToFile) + int sizeToGet = fileSize; + int localFileSize = getLocalFileSize (params->localName); + int appendToFile = params->useResume; + int appendOffset = 0; + if (-1 == localFileSize && 0 == fileSize) { - if (localFileSize == fileSize) + // Zero byte file on server + FTP_DEBUG ("Zero byte file on server, create empty file locally\n"); + FILE *fdesc = fopen (params->localName, "ab"); + if (NULL != fdesc) { - FTP_DEBUG ("File already downloaded\n"); - CLEAN_PARAMS (FTP_SAMESIZE); + fclose (fdesc); } - else if (localFileSize > fileSize) - { - FTP_ERROR ("Local file (%s) is greater than distant file (%s)\n", params->localName, params->remoteName); - CLEAN_PARAMS (FTP_BADSIZE); - } - sizeToGet = fileSize - localFileSize; + CLEAN_PARAMS (FTP_SUCCESS); + } - appendOffset = fileSize - sizeToGet; - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "REST %d\r\n", appendOffset); - _ftp_status ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + if (-1 == localFileSize && 1 == params->useResume) + { + FTP_DEBUG ("File does not exist ... full download\n"); + appendToFile = 0; + } + if (1 == appendToFile) + { + if (localFileSize == fileSize) { - FTP_ERROR ("Unable to set server offset\n"); - CLEAN_PARAMS (ftp_result); + FTP_DEBUG ("File already downloaded\n"); + CLEAN_PARAMS (FTP_SAMESIZE); + } + else if (localFileSize > fileSize) + { + FTP_ERROR ("Local file (%s) is greater than distant file (%s)\n", params->localName, params->remoteName); + CLEAN_PARAMS (FTP_BADSIZE); + } + sizeToGet = fileSize - localFileSize; + + appendOffset = fileSize - sizeToGet; + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "REST %d\r\n", appendOffset); + _ftp_status ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) + { + FTP_ERROR ("Unable to set server offset\n"); + CLEAN_PARAMS (ftp_result); } } - FTP_DEBUG ("Thread will connect to %s:%d\n", dataIp, dataPort); - dataSocket = vp_os_malloc (sizeof (vp_com_socket_t)); - if (NULL == dataSocket) + FTP_DEBUG ("Thread will connect to %s:%d\n", dataIp, dataPort); + dataSocket = vp_os_malloc (sizeof (vp_com_socket_t)); + if (NULL == dataSocket) { - FTP_ERROR ("Unable to allocate socket structure\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to allocate socket structure\n"); + CLEAN_PARAMS (FTP_FAIL); } - dataSocket->type = VP_COM_CLIENT; - dataSocket->protocol = VP_COM_TCP; - dataSocket->port = dataPort; - strncpy (dataSocket->serverHost, dataIp, VP_COM_NAME_MAXSIZE); - dataSocket->is_multicast = 0; - dataSocket->block = VP_COM_WAITALL; + dataSocket->type = VP_COM_CLIENT; + dataSocket->protocol = VP_COM_TCP; + dataSocket->port = dataPort; + strncpy (dataSocket->serverHost, dataIp, VP_COM_NAME_MAXSIZE); + dataSocket->is_multicast = 0; + dataSocket->block = VP_COM_WAITALL; - C_RESULT vp_result = vp_com_open_socket (dataSocket, &dataRead, &dataWrite); - if (VP_FAILED (vp_result)) + C_RESULT vp_result = vp_com_open_socket (dataSocket, &dataRead, &dataWrite); + if (VP_FAILED (vp_result)) { - FTP_ERROR ("Unable to connect\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to connect\n"); + CLEAN_PARAMS (FTP_FAIL); } - int result = setSockTimeout ((int)dataSocket->priv, SOCK_TO_SEC, SOCK_TO_USEC); - if (0 > result) + int result = setSockTimeout ((int)dataSocket->priv, SOCK_TO_SEC, SOCK_TO_USEC); + if (0 > result) { - FTP_ERROR ("Unable to set data socket timeout\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to set data socket timeout\n"); + CLEAN_PARAMS (FTP_FAIL); } - CHECK_ABORT; + CHECK_ABORT; - vp_os_memset (buffer, 0x0, COMMAND_BUFFER_SIZE); - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "RETR %s\r\n", params->remoteName); - ftp_result = ftpSend (params->ftp, buffer); - if (FTP_FAILED (ftp_result)) + vp_os_memset (buffer, 0x0, COMMAND_BUFFER_SIZE); + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "RETR %s\r\n", params->remoteName); + ftp_result = ftpSend (params->ftp, buffer); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending RETR command\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Error while sending RETR command\n"); + CLEAN_PARAMS (ftp_result); } - int sizeGot = appendOffset; - float percentGot = (sizeGot * 100.0) / (fileSize *1.0); - params->callback (FTP_PROGRESS, (void *)&percentGot, params->ftp); - - filePart = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == filePart) + int sizeGot = appendOffset; + float percentGot = (sizeGot * 100.0) / (fileSize *1.0); + params->callback (FTP_PROGRESS, (void *)&percentGot, params->ftp); + + filePart = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == filePart) { - FTP_ERROR ("Unable to alloc buffer\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to alloc buffer\n"); + CLEAN_PARAMS (FTP_FAIL); } - if (1 == appendToFile) + if (1 == appendToFile) { - localFile = fopen (params->localName, "ab"); + localFile = fopen (params->localName, "ab"); } - else + else { - localFile = fopen (params->localName, "wb"); + localFile = fopen (params->localName, "wb"); } - if (NULL == localFile) + if (NULL == localFile) { - FTP_ERROR ("Unable to open dest file %s\n", params->localName); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to open dest file %s\n", params->localName); + CLEAN_PARAMS (FTP_FAIL); } - while (sizeGot < fileSize) + while (sizeGot < fileSize) { - CHECK_ABORT; - int bytes = MAX_SIZE_MSG-1; - C_RESULT vp_result = dataRead (dataSocket, (uint8_t *)filePart, &bytes); - if (VP_FAILED (vp_result)) + CHECK_ABORT; + int bytes = MAX_SIZE_MSG-1; + C_RESULT vp_result = dataRead (dataSocket, (uint8_t *)filePart, &bytes); + if (VP_FAILED (vp_result)) { - FTP_ERROR ("Error while receiving data\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Error while receiving data\n"); + CLEAN_PARAMS (FTP_FAIL); } - if (0 >= bytes) + if (0 >= bytes) { - FTP_ERROR ("Recv timeout\n"); - CLEAN_PARAMS (FTP_TIMEOUT); + FTP_ERROR ("Recv timeout\n"); + CLEAN_PARAMS (FTP_TIMEOUT); } - if (0 > fwrite (filePart, 1, bytes, localFile)) + if (0 > fwrite (filePart, 1, bytes, localFile)) { - FTP_ERROR ("Unable to write to file\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to write to file\n"); + CLEAN_PARAMS (FTP_FAIL); } - sizeGot += bytes; - percentGot = (sizeGot * 100.0) / (fileSize * 1.0); - params->callback (FTP_PROGRESS, (void *)&percentGot, params->ftp); + sizeGot += bytes; + percentGot = (sizeGot * 100.0) / (fileSize * 1.0); + params->callback (FTP_PROGRESS, (void *)&percentGot, params->ftp); } - ftp_result = ftpRecv (params->ftp, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + ftp_result = ftpRecv (params->ftp, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while getting answer\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Error while getting answer\n"); + CLEAN_PARAMS (ftp_result); } - repCode = getResponseCode (srvMsg); - if (150 != repCode) + repCode = getResponseCode (srvMsg); + if (150 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 150)\n", repCode); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Bad response from server (%d, expected 150)\n", repCode); + CLEAN_PARAMS (FTP_FAIL); } - /* Cleaning FTP */ - if (NULL != dataSocket) + /* Cleaning FTP */ + if (NULL != dataSocket) { - vp_com_close_socket (dataSocket); - vp_os_free (dataSocket); - dataSocket = NULL; + vp_com_close_socket (dataSocket); + vp_os_free (dataSocket); + dataSocket = NULL; } - _ftp_status loc226Status = waitFor226Answer (params->ftp); - flushFtp (params->ftp); + _ftp_status loc226Status = waitFor226Answer (params->ftp); + flushFtp (params->ftp); - CLEAN_PARAMS (loc226Status); + CLEAN_PARAMS (loc226Status); } DEFINE_THREAD_ROUTINE (ftpPut, param) { - char *srvMsg = NULL; - char *buffer = NULL; - char *filePart = NULL; - vp_com_socket_t *dataSocket = NULL; - Read dataRead = NULL; - Write dataWrite = NULL; - FILE *localFile = NULL; - _ftp_put_param *params = (_ftp_put_param *)param; - FTP_DEBUG ("Uploading %s to %s [resume : %c]\n", params->localName, params->remoteName, params->useResume ? 'y' : 'n'); - if (NULL == params->ftp) + char *srvMsg = NULL; + char *buffer = NULL; + char *filePart = NULL; + vp_com_socket_t *dataSocket = NULL; + Read dataRead = NULL; + Write dataWrite = NULL; + FILE *localFile = NULL; + _ftp_put_param *params = (_ftp_put_param *)param; + FTP_DEBUG ("Uploading %s to %s [resume : %c]\n", params->localName, params->remoteName, params->useResume ? 'y' : 'n'); + if (NULL == params->ftp) { - FTP_ERROR ("FTP not open\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("FTP not open\n"); + CLEAN_PARAMS (FTP_FAIL); } - flushFtp (params->ftp); + flushFtp (params->ftp); - buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - if (NULL == buffer) + buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + if (NULL == buffer) { - FTP_ERROR ("Unable to alloc buffer\n"); - CLEAN_PARAMS (FTP_FAIL); - } - srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == srvMsg) + FTP_ERROR ("Unable to alloc buffer\n"); + CLEAN_PARAMS (FTP_FAIL); + } + srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == srvMsg) { - FTP_ERROR ("Unable to alloc buffer\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to alloc buffer\n"); + CLEAN_PARAMS (FTP_FAIL); } - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "PASV\r\n"); - _ftp_status ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "PASV\r\n"); + _ftp_status ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while entering passive mode\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Error while entering passive mode\n"); + CLEAN_PARAMS (ftp_result); } - int repCode = getResponseCode (srvMsg); - if (227 != repCode) + int repCode = getResponseCode (srvMsg); + if (227 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 227)\n", repCode); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Bad response from server (%d, expected 227)\n", repCode); + CLEAN_PARAMS (FTP_FAIL); } - char dataIp [IP_STRING_SIZE] = {0}; - int dataPort = 0; - getPassiveIpAndPort (srvMsg, dataIp, &dataPort, IP_STRING_SIZE); + char dataIp [IP_STRING_SIZE] = {0}; + int dataPort = 0; + getPassiveIpAndPort (params->ftp, srvMsg, dataIp, &dataPort, IP_STRING_SIZE); - ftp_result = goToBinaryMode (params->ftp); - if (FTP_FAILED (ftp_result)) + ftp_result = goToBinaryMode (params->ftp); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Unable to go to binary mode\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Unable to go to binary mode\n"); + CLEAN_PARAMS (ftp_result); } - - int localFileSize = getLocalFileSize (params->localName); - if (0 >= localFileSize) + + int localFileSize = getLocalFileSize (params->localName); + if (0 >= localFileSize) { - FTP_ERROR ("File %s does not exist on filesystem\n", params->localName); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("File %s does not exist on filesystem\n", params->localName); + CLEAN_PARAMS (FTP_FAIL); } - int fileSize = getFileSize (params->ftp, params->remoteName); - int sizeToPut = localFileSize; - int appendToFile = params->useResume; - int appendOffset = 0; - if (-1 == fileSize && 1 == params->useResume) + int fileSize = getFileSize (params->ftp, params->remoteName); + int sizeToPut = localFileSize; + int appendToFile = params->useResume; + int appendOffset = 0; + if (-1 == fileSize && 1 == params->useResume) { - FTP_DEBUG ("File does not exist on server ... full upload\n"); - appendToFile = 0; + FTP_DEBUG ("File does not exist on server ... full upload\n"); + appendToFile = 0; } - if (1 == appendToFile) + if (1 == appendToFile) { - if (localFileSize == fileSize) + if (localFileSize == fileSize) { - FTP_DEBUG ("File already uploaded\n"); - CLEAN_PARAMS (FTP_SAMESIZE); + FTP_DEBUG ("File already uploaded\n"); + CLEAN_PARAMS (FTP_SAMESIZE); } - else if (localFileSize < fileSize) + else if (localFileSize < fileSize) { - FTP_ERROR ("Distant file (%s) is greather than local file (%s)\n", params->remoteName, params->localName); - CLEAN_PARAMS (FTP_BADSIZE); + FTP_ERROR ("Distant file (%s) is greather than local file (%s)\n", params->remoteName, params->localName); + CLEAN_PARAMS (FTP_BADSIZE); } - sizeToPut = localFileSize - fileSize; + sizeToPut = localFileSize - fileSize; - appendOffset = localFileSize - sizeToPut; - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "REST %d\r\n", appendOffset); - ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + appendOffset = localFileSize - sizeToPut; + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "REST %d\r\n", appendOffset); + ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Unable to set server offset\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Unable to set server offset\n"); + CLEAN_PARAMS (ftp_result); } } - FTP_DEBUG ("Thread will connect to %s:%d\n", dataIp, dataPort); - dataSocket = vp_os_malloc (sizeof (vp_com_socket_t)); - if (NULL == dataSocket) + FTP_DEBUG ("Thread will connect to %s:%d\n", dataIp, dataPort); + dataSocket = vp_os_malloc (sizeof (vp_com_socket_t)); + if (NULL == dataSocket) { - FTP_ERROR ("Unable to allocate socket structure\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to allocate socket structure\n"); + CLEAN_PARAMS (FTP_FAIL); } - dataSocket->type = VP_COM_CLIENT; - dataSocket->protocol = VP_COM_TCP; - dataSocket->port = dataPort; - strncpy (dataSocket->serverHost, dataIp, VP_COM_NAME_MAXSIZE); - dataSocket->is_multicast = 0; - dataSocket->block = VP_COM_DEFAULT; + dataSocket->type = VP_COM_CLIENT; + dataSocket->protocol = VP_COM_TCP; + dataSocket->port = dataPort; + strncpy (dataSocket->serverHost, dataIp, VP_COM_NAME_MAXSIZE); + dataSocket->is_multicast = 0; + dataSocket->block = VP_COM_DEFAULT; - C_RESULT vp_result = vp_com_open_socket (dataSocket, &dataRead, &dataWrite); - if (VP_FAILED (vp_result)) + C_RESULT vp_result = vp_com_open_socket (dataSocket, &dataRead, &dataWrite); + if (VP_FAILED (vp_result)) { - FTP_ERROR ("Unable to connect\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to connect\n"); + CLEAN_PARAMS (FTP_FAIL); } - int result = setSockTimeout ((int)dataSocket->priv, SOCK_TO_SEC, SOCK_TO_USEC); - if (0 > result) + int result = setSockTimeout ((int)dataSocket->priv, SOCK_TO_SEC, SOCK_TO_USEC); + if (0 > result) { - FTP_ERROR ("Unable to set data socket timeout\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to set data socket timeout\n"); + CLEAN_PARAMS (FTP_FAIL); } - CHECK_ABORT; + CHECK_ABORT; - vp_os_memset (buffer, 0x0, COMMAND_BUFFER_SIZE); - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "STOR %s\r\n", params->remoteName); - ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + vp_os_memset (buffer, 0x0, COMMAND_BUFFER_SIZE); + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "STOR %s\r\n", params->remoteName); + ftp_result = ftpTransfert (params->ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending command\n"); - CLEAN_PARAMS (ftp_result); + FTP_ERROR ("Error while sending command\n"); + CLEAN_PARAMS (ftp_result); } - repCode = getResponseCode (srvMsg); - if (150 != repCode) + repCode = getResponseCode (srvMsg); + if (150 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 150)\n", repCode); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Bad response from server (%d, expected 150)\n", repCode); + CLEAN_PARAMS (FTP_FAIL); } - int sizeSent = appendOffset; - float percentSend = (sizeSent * 100.0) / (localFileSize *1.0); - params->callback (FTP_PROGRESS, (void *)&percentSend, params->ftp); + int sizeSent = appendOffset; + float percentSend = (sizeSent * 100.0) / (localFileSize *1.0); + params->callback (FTP_PROGRESS, (void *)&percentSend, params->ftp); - int numberOfFullSendNeeded = (sizeToPut / (MAX_SIZE_MSG-1)); - int partialSendNeeded = (sizeToPut % (MAX_SIZE_MSG-1)); // Zero if not needed, non-zero if needed - filePart = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == filePart) + int numberOfFullSendNeeded = (sizeToPut / (MAX_SIZE_MSG-1)); + int partialSendNeeded = (sizeToPut % (MAX_SIZE_MSG-1)); // Zero if not needed, non-zero if needed + filePart = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == filePart) { - FTP_ERROR ("Unable to alloc buffer \n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to alloc buffer \n"); + CLEAN_PARAMS (FTP_FAIL); } - localFile = fopen (params->localName, "rb"); - if (NULL == localFile) + localFile = fopen (params->localName, "rb"); + if (NULL == localFile) { - FTP_ERROR ("Unable to open source file %s\n", params->localName); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to open source file %s\n", params->localName); + CLEAN_PARAMS (FTP_FAIL); } - fseek (localFile, appendOffset, SEEK_SET); + fseek (localFile, appendOffset, SEEK_SET); - int numSend = 0; - for (numSend = 0; numSend < numberOfFullSendNeeded; numSend++) + int numSend = 0; + for (numSend = 0; numSend < numberOfFullSendNeeded; numSend++) { - CHECK_ABORT; - int bytes = fread (filePart, 1, MAX_SIZE_MSG-1, localFile); - if (MAX_SIZE_MSG-1 != bytes) + CHECK_ABORT; + int bytes = fread (filePart, 1, MAX_SIZE_MSG-1, localFile); + if (MAX_SIZE_MSG-1 != bytes) { - FTP_ERROR ("Unable to read from file\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to read from file\n"); + CLEAN_PARAMS (FTP_FAIL); } - C_RESULT vp_result = dataWrite (dataSocket, (uint8_t *)filePart, &bytes); - if (VP_FAILED (vp_result)) + C_RESULT vp_result = dataWrite (dataSocket, (uint8_t *)filePart, &bytes); + if (VP_FAILED (vp_result)) { - FTP_ERROR ("Unable to send data\n"); - CLEAN_PARAMS (FTP_FAIL); + FTP_ERROR ("Unable to send data\n"); + CLEAN_PARAMS (FTP_FAIL); } - if (MAX_SIZE_MSG-1 > bytes) + if (MAX_SIZE_MSG-1 > bytes) { - FTP_ERROR ("Send timeout\n"); - CLEAN_PARAMS (FTP_TIMEOUT); + FTP_ERROR ("Send timeout\n"); + CLEAN_PARAMS (FTP_TIMEOUT); } - sizeSent += bytes; - percentSend = (sizeSent * 100.0) / (localFileSize * 1.0); - params->callback (FTP_PROGRESS, (void *)&percentSend, params->ftp); - } - - if (0 != partialSendNeeded) - { - CHECK_ABORT; - vp_os_memset (filePart, 0x0, MAX_SIZE_MSG); - int bytes = fread (filePart, 1, MAX_SIZE_MSG-1, localFile); - FTP_DEBUG ("Read %d bytes\n", bytes); - if (0 > bytes) - { - FTP_ERROR ("Unable to read from file\n"); - CLEAN_PARAMS (FTP_FAIL); - } - int sendBytes = bytes; - C_RESULT vp_result = dataWrite (dataSocket, (uint8_t *)filePart, &sendBytes); - if (VP_FAILED (vp_result)) - { - FTP_ERROR ("Unable to send data\n"); - CLEAN_PARAMS (FTP_FAIL); - } - if (bytes > sendBytes) - { - FTP_ERROR ("Send timeout\n"); - CLEAN_PARAMS (FTP_TIMEOUT); - } - sizeSent += bytes; - percentSend = (sizeSent * 100.0) / (localFileSize * 1.0); - params->callback (FTP_PROGRESS, (void *)&percentSend, params->ftp); + sizeSent += bytes; + percentSend = (sizeSent * 100.0) / (localFileSize * 1.0); + params->callback (FTP_PROGRESS, (void *)&percentSend, params->ftp); } - - /* Cleaning FTP */ - if (NULL != dataSocket) + if (0 != partialSendNeeded) { - vp_com_close_socket (dataSocket); - vp_os_free (dataSocket); - dataSocket = NULL; + CHECK_ABORT; + vp_os_memset (filePart, 0x0, MAX_SIZE_MSG); + int bytes = fread (filePart, 1, MAX_SIZE_MSG-1, localFile); + FTP_DEBUG ("Read %d bytes\n", bytes); + if (0 > bytes) + { + FTP_ERROR ("Unable to read from file\n"); + CLEAN_PARAMS (FTP_FAIL); + } + int sendBytes = bytes; + C_RESULT vp_result = dataWrite (dataSocket, (uint8_t *)filePart, &sendBytes); + if (VP_FAILED (vp_result)) + { + FTP_ERROR ("Unable to send data\n"); + CLEAN_PARAMS (FTP_FAIL); + } + if (bytes > sendBytes) + { + FTP_ERROR ("Send timeout\n"); + CLEAN_PARAMS (FTP_TIMEOUT); + } + sizeSent += bytes; + percentSend = (sizeSent * 100.0) / (localFileSize * 1.0); + params->callback (FTP_PROGRESS, (void *)&percentSend, params->ftp); } - _ftp_status loc226Status = waitFor226Answer (params->ftp); - flushFtp (params->ftp); - CLEAN_PARAMS (loc226Status); + + /* Cleaning FTP */ + if (NULL != dataSocket) + { + vp_com_close_socket (dataSocket); + vp_os_free (dataSocket); + dataSocket = NULL; + } + _ftp_status loc226Status = waitFor226Answer (params->ftp); + flushFtp (params->ftp); + + CLEAN_PARAMS (loc226Status); } _ftp_status ftpPut (_ftp_t *ftp, const char *localName, const char *remoteName, int useResume, ftp_callback callback) { - THREAD_HANDLE putThread; - ftp_callback actualCallback = (NULL != callback) ? callback : emptyCallback; - if (NULL == ftp) + THREAD_HANDLE putThread; + ftp_callback actualCallback = (NULL != callback) ? callback : emptyCallback; + if (NULL == ftp) { - actualCallback (FTP_FAIL, NULL, ftp); - return FTP_FAIL; + actualCallback (FTP_FAIL, NULL, ftp); + return FTP_FAIL; } - if (1 == ftp->opInProgress) + if (1 == ftp->opInProgress) { - actualCallback (FTP_BUSY, NULL, ftp); - return FTP_BUSY; + actualCallback (FTP_BUSY, NULL, ftp); + return FTP_BUSY; } - ftp->opInProgress = 1; + ftp->opInProgress = 1; - _ftp_put_param *param = vp_os_malloc (sizeof (_ftp_put_param)); + _ftp_put_param *param = vp_os_malloc (sizeof (_ftp_put_param)); - if (NULL == param) + if (NULL == param) { - FTP_ERROR ("Unable to allocate thread param\n"); - actualCallback (FTP_FAIL, NULL, ftp); - ftp->opInProgress = 0; - return FTP_FAIL; + FTP_ERROR ("Unable to allocate thread param\n"); + actualCallback (FTP_FAIL, NULL, ftp); + ftp->opInProgress = 0; + return FTP_FAIL; } - param->ftp = ftp; - strncpy (param->localName, localName, FILE_NAME_MAX_SIZE); - param->localName [FILE_NAME_MAX_SIZE-1] = '\0'; - strncpy (param->remoteName, remoteName, FILE_NAME_MAX_SIZE); - param->remoteName [FILE_NAME_MAX_SIZE-1] = '\0'; - param->useResume = useResume; - param->callback = actualCallback; - param->fileList = NULL; - _ftp_status threadReturn = FTP_SUCCESS; + param->ftp = ftp; + strncpy (param->localName, localName, FILE_NAME_MAX_SIZE); + param->localName [FILE_NAME_MAX_SIZE-1] = '\0'; + strncpy (param->remoteName, remoteName, FILE_NAME_MAX_SIZE); + param->remoteName [FILE_NAME_MAX_SIZE-1] = '\0'; + param->useResume = useResume; + param->callback = actualCallback; + param->fileList = NULL; + _ftp_status threadReturn = FTP_SUCCESS; - vp_os_thread_create (thread_ftpPut, (THREAD_PARAMS)param, &putThread); + vp_os_thread_create (thread_ftpPut, (THREAD_PARAMS)param, &putThread); - if (NULL == callback) + if (NULL == callback) { - vp_os_thread_join (putThread); - threadReturn = ftp->lastStatus; + vp_os_thread_join (putThread); + threadReturn = ftp->lastStatus; } - return threadReturn; + return threadReturn; } _ftp_status ftpGet (_ftp_t *ftp, const char *remoteName, const char *localName, int useResume, ftp_callback callback) { - THREAD_HANDLE getThread; - ftp_callback actualCallback = (NULL != callback) ? callback : emptyCallback; - if (NULL == ftp) + THREAD_HANDLE getThread; + ftp_callback actualCallback = (NULL != callback) ? callback : emptyCallback; + if (NULL == ftp) { - actualCallback (FTP_FAIL, NULL, ftp); - return FTP_FAIL; + actualCallback (FTP_FAIL, NULL, ftp); + return FTP_FAIL; } - if (1 == ftp->opInProgress) + if (1 == ftp->opInProgress) { - actualCallback (FTP_BUSY, NULL, ftp); - return FTP_BUSY; + actualCallback (FTP_BUSY, NULL, ftp); + return FTP_BUSY; } - ftp->opInProgress = 1; + ftp->opInProgress = 1; - _ftp_get_param *param = vp_os_malloc (sizeof (_ftp_get_param)); + _ftp_get_param *param = vp_os_malloc (sizeof (_ftp_get_param)); - if (NULL == param) + if (NULL == param) { - FTP_ERROR ("Unable to allocate thread param\n"); - actualCallback (FTP_FAIL, NULL, ftp); - ftp->opInProgress = 0; - return FTP_FAIL; + FTP_ERROR ("Unable to allocate thread param\n"); + actualCallback (FTP_FAIL, NULL, ftp); + ftp->opInProgress = 0; + return FTP_FAIL; } - param->ftp = ftp; - strncpy (param->localName, localName, FILE_NAME_MAX_SIZE); - param->localName [FILE_NAME_MAX_SIZE-1] = '\0'; - strncpy (param->remoteName, remoteName, FILE_NAME_MAX_SIZE); - param->remoteName [FILE_NAME_MAX_SIZE-1] = '\0'; - param->useResume = useResume; - param->callback = actualCallback; - param->fileList = NULL; - _ftp_status threadReturn = FTP_SUCCESS; + param->ftp = ftp; + strncpy (param->localName, localName, FILE_NAME_MAX_SIZE); + param->localName [FILE_NAME_MAX_SIZE-1] = '\0'; + strncpy (param->remoteName, remoteName, FILE_NAME_MAX_SIZE); + param->remoteName [FILE_NAME_MAX_SIZE-1] = '\0'; + param->useResume = useResume; + param->callback = actualCallback; + param->fileList = NULL; + _ftp_status threadReturn = FTP_SUCCESS; - vp_os_thread_create (thread_ftpGet, (THREAD_PARAMS)param, &getThread); + vp_os_thread_create (thread_ftpGet, (THREAD_PARAMS)param, &getThread); - if (NULL == callback) + if (NULL == callback) { - vp_os_thread_join (getThread); - threadReturn = ftp->lastStatus; + vp_os_thread_join (getThread); + threadReturn = ftp->lastStatus; } - return threadReturn; + return threadReturn; } _ftp_status ftpList (_ftp_t *ftp, char **fileList, ftp_callback callback) { - if (NULL == fileList && NULL == callback) + if (NULL == fileList && NULL == callback) { - FTP_ERROR ("file list and callback pointer must not be both NULL\n"); - return FTP_FAIL; + FTP_ERROR ("file list and callback pointer must not be both NULL\n"); + return FTP_FAIL; } - THREAD_HANDLE listThread; - ftp_callback actualCallback = (NULL != callback) ? callback : emptyCallback; - if (NULL == ftp) + THREAD_HANDLE listThread; + ftp_callback actualCallback = (NULL != callback) ? callback : emptyCallback; + if (NULL == ftp) { - actualCallback (FTP_FAIL, NULL, ftp); - return FTP_FAIL; + actualCallback (FTP_FAIL, NULL, ftp); + return FTP_FAIL; } - if (1 == ftp->opInProgress) + if (1 == ftp->opInProgress) { - actualCallback (FTP_BUSY, NULL, ftp); - return FTP_BUSY; + actualCallback (FTP_BUSY, NULL, ftp); + return FTP_BUSY; } - ftp->opInProgress = 1; + ftp->opInProgress = 1; - _ftp_list_param *param = vp_os_malloc (sizeof (_ftp_list_param)); + _ftp_list_param *param = vp_os_malloc (sizeof (_ftp_list_param)); - if (NULL == param) + if (NULL == param) { - FTP_ERROR ("Unable to allocate thread param\n"); - actualCallback (FTP_FAIL, NULL, ftp); - ftp->opInProgress = 0; - return FTP_FAIL; + FTP_ERROR ("Unable to allocate thread param\n"); + actualCallback (FTP_FAIL, NULL, ftp); + ftp->opInProgress = 0; + return FTP_FAIL; } - param->fileList = vp_os_malloc (sizeof (char) * LIST_BUFFER_BLOCKSIZE); - if (NULL == param->fileList) + param->fileList = vp_os_malloc (sizeof (char) * LIST_BUFFER_BLOCKSIZE); + if (NULL == param->fileList) { - FTP_ERROR ("Unable to allocate list buffer\n"); - actualCallback (FTP_FAIL, NULL, ftp); - ftp->opInProgress = 0; - vp_os_free (param); - return FTP_FAIL; + FTP_ERROR ("Unable to allocate list buffer\n"); + actualCallback (FTP_FAIL, NULL, ftp); + ftp->opInProgress = 0; + vp_os_free (param); + return FTP_FAIL; } - param->ftp = ftp; - param->listSize = LIST_BUFFER_BLOCKSIZE; - param->callback = actualCallback; - _ftp_status threadReturn = FTP_SUCCESS; + param->ftp = ftp; + param->listSize = LIST_BUFFER_BLOCKSIZE; + param->callback = actualCallback; + _ftp_status threadReturn = FTP_SUCCESS; - vp_os_thread_create (thread_ftpList, (THREAD_PARAMS)param, &listThread); + vp_os_thread_create (thread_ftpList, (THREAD_PARAMS)param, &listThread); - if (NULL == callback) + if (NULL == callback) { - vp_os_thread_join (listThread); - threadReturn = ftp->lastStatus; - if (FTP_SUCCESS == threadReturn) + vp_os_thread_join (listThread); + threadReturn = ftp->lastStatus; + if (FTP_SUCCESS == threadReturn) { - *fileList = ftp->lastFileList; - ftp->lastFileList = NULL; + *fileList = ftp->lastFileList; + ftp->lastFileList = NULL; } } - return threadReturn; + return threadReturn; } _ftp_status ftpRemove (_ftp_t *ftp, const char *remoteName) { - _ftp_status ftp_result = FTP_FAIL; + _ftp_status ftp_result = FTP_FAIL; - if (NULL == remoteName) + if (NULL == remoteName) { - FTP_ERROR ("remoteName must not be a NULL pointer\n"); - return FTP_FAIL; + FTP_ERROR ("remoteName must not be a NULL pointer\n"); + return FTP_FAIL; } - if (NULL == ftp) + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); - return FTP_FAIL; + FTP_ERROR ("FTP not open\n"); + return FTP_FAIL; } - char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == buffer || NULL == srvMsg) + char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == buffer || NULL == srvMsg) { - FTP_ERROR ("Unable to alloc buffer\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return FTP_FAIL; + FTP_ERROR ("Unable to alloc buffer\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return FTP_FAIL; } - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "DELE %s\r\n", remoteName); - ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "DELE %s\r\n", remoteName); + ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending the delete command\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + FTP_ERROR ("Error while sending the delete command\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } - int repCode = getResponseCode (srvMsg); - if (250 != repCode && 550 != repCode) + int repCode = getResponseCode (srvMsg); + if (250 != repCode && 550 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 250 or 550)\n", repCode); - ftp_result = FTP_FAIL; + FTP_ERROR ("Bad response from server (%d, expected 250 or 550)\n", repCode); + ftp_result = FTP_FAIL; } - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } _ftp_status ftpRename (_ftp_t *ftp, const char *origin, const char *dest) { - _ftp_status ftp_result = FTP_FAIL; + _ftp_status ftp_result = FTP_FAIL; - if (NULL == origin || - NULL == dest) + if (NULL == origin || + NULL == dest) { - FTP_ERROR ("origin and dest pointers must not be NULL\n"); - return FTP_FAIL; + FTP_ERROR ("origin and dest pointers must not be NULL\n"); + return FTP_FAIL; } - if (NULL == ftp) + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); - return FTP_FAIL; + FTP_ERROR ("FTP not open\n"); + return FTP_FAIL; } - char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == buffer || NULL == srvMsg) + char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == buffer || NULL == srvMsg) { - FTP_ERROR ("Unable to alloc buffer\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return FTP_FAIL; + FTP_ERROR ("Unable to alloc buffer\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return FTP_FAIL; } - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "RNFR %s\r\n", origin); - ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "RNFR %s\r\n", origin); + ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending the RNFR command\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + FTP_ERROR ("Error while sending the RNFR command\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } - int repCode = getResponseCode (srvMsg); - if (350 != repCode) + int repCode = getResponseCode (srvMsg); + if (350 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 350)\n", repCode); - vp_os_free (buffer); - vp_os_free (srvMsg); - ftp_result = FTP_FAIL; - return ftp_result; + FTP_ERROR ("Bad response from server (%d, expected 350)\n", repCode); + vp_os_free (buffer); + vp_os_free (srvMsg); + ftp_result = FTP_FAIL; + return ftp_result; } - - vp_os_memset (buffer, 0x0, COMMAND_BUFFER_SIZE); - vp_os_memset (srvMsg, 0x0, MAX_SIZE_MSG); - - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "RNTO %s\r\n", dest); - ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + + vp_os_memset (buffer, 0x0, COMMAND_BUFFER_SIZE); + vp_os_memset (srvMsg, 0x0, MAX_SIZE_MSG); + + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "RNTO %s\r\n", dest); + ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending the RNTO command\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + FTP_ERROR ("Error while sending the RNTO command\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } - repCode = getResponseCode (srvMsg); - if (250 == repCode) // Rename worked + repCode = getResponseCode (srvMsg); + if (250 == repCode) // Rename worked { - ftp_result = FTP_SUCCESS; + ftp_result = FTP_SUCCESS; } - else if (550 == repCode) // Source file don't exist + else if (550 == repCode) // Source file don't exist { - FTP_DEBUG ("File %s doest not exist on FTP\n", origin); - ftp_result = FTP_SAMESIZE; + FTP_DEBUG ("File %s doest not exist on FTP\n", origin); + ftp_result = FTP_SAMESIZE; } - else + else { - FTP_ERROR ("Bad response from server (%d, expected 250 or 550)\n", repCode); - ftp_result = FTP_FAIL; + FTP_ERROR ("Bad response from server (%d, expected 250 or 550)\n", repCode); + ftp_result = FTP_FAIL; } - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } _ftp_status ftpCd (_ftp_t *ftp, const char *nextDir) { - _ftp_status ftp_result = FTP_FAIL; + _ftp_status ftp_result = FTP_FAIL; - if (NULL == nextDir) + if (NULL == nextDir) { - FTP_ERROR ("nextDir must not be NULL\n"); - return FTP_FAIL; + FTP_ERROR ("nextDir must not be NULL\n"); + return FTP_FAIL; } - if (NULL == ftp) + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); - return FTP_FAIL; + FTP_ERROR ("FTP not open\n"); + return FTP_FAIL; } - char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == buffer || NULL == srvMsg) + char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == buffer || NULL == srvMsg) { - FTP_ERROR ("Unable to alloc buffer\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return FTP_FAIL; + FTP_ERROR ("Unable to alloc buffer\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return FTP_FAIL; } - - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "CWD %s\r\n", nextDir); - ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "CWD %s\r\n", nextDir); + ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending the CWD command\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + FTP_ERROR ("Error while sending the CWD command\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } - int repCode = getResponseCode (srvMsg); - if (250 != repCode) + int repCode = getResponseCode (srvMsg); + if (250 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 250)\n", repCode); - ftp_result = FTP_FAIL; + FTP_ERROR ("Bad response from server (%d, expected 250)\n", repCode); + ftp_result = FTP_FAIL; } - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } _ftp_status ftpPwd (_ftp_t *ftp, char *workingDir, int wdLen) { - _ftp_status ftp_result = FTP_FAIL; + _ftp_status ftp_result = FTP_FAIL; - if (NULL == workingDir) + if (NULL == workingDir) { - FTP_ERROR ("workingDir must not be NULL\n"); - return FTP_FAIL; + FTP_ERROR ("workingDir must not be NULL\n"); + return FTP_FAIL; } - if (NULL == ftp) + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); - return FTP_FAIL; + FTP_ERROR ("FTP not open\n"); + return FTP_FAIL; } - char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == srvMsg) + char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == srvMsg) { - FTP_ERROR ("Unable to alloc buffer\n"); - return FTP_FAIL; + FTP_ERROR ("Unable to alloc buffer\n"); + return FTP_FAIL; } - - ftp_result = ftpTransfert (ftp, "PWD\r\n\0", srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + + ftp_result = ftpTransfert (ftp, "PWD\r\n\0", srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending the CWD command\n"); - vp_os_free (srvMsg); - return ftp_result; + FTP_ERROR ("Error while sending the CWD command\n"); + vp_os_free (srvMsg); + return ftp_result; } - int repCode = getResponseCode (srvMsg); - if (257 != repCode) + int repCode = getResponseCode (srvMsg); + if (257 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 257)\n", repCode); - ftp_result = FTP_FAIL; + FTP_ERROR ("Bad response from server (%d, expected 257)\n", repCode); + ftp_result = FTP_FAIL; } - else + else { - int pwdStartIndex = 0; - int pwdEndIndex = 0; - for (pwdStartIndex = 0; (pwdStartIndex < MAX_SIZE_MSG) && (srvMsg[pwdStartIndex] != '\"'); pwdStartIndex++); - for (pwdEndIndex = pwdStartIndex+1; (pwdEndIndex < MAX_SIZE_MSG) && (srvMsg[pwdEndIndex] != '\"'); pwdEndIndex++); - if (MAX_SIZE_MSG == pwdStartIndex || - MAX_SIZE_MSG == pwdEndIndex) + int pwdStartIndex = 0; + int pwdEndIndex = 0; + for (pwdStartIndex = 0; (pwdStartIndex < MAX_SIZE_MSG) && (srvMsg[pwdStartIndex] != '\"'); pwdStartIndex++); + for (pwdEndIndex = pwdStartIndex+1; (pwdEndIndex < MAX_SIZE_MSG) && (srvMsg[pwdEndIndex] != '\"'); pwdEndIndex++); + if (MAX_SIZE_MSG == pwdStartIndex || + MAX_SIZE_MSG == pwdEndIndex) { - FTP_ERROR ("FTP Answer does not conains PWD\n"); - ftp_result = FTP_FAIL; + FTP_ERROR ("FTP Answer does not conains PWD\n"); + ftp_result = FTP_FAIL; } - else + else { - int srvLen = pwdEndIndex - (pwdStartIndex + 1); - int totalLen = (srvLen < wdLen) ? srvLen : wdLen; - strncpy (workingDir, &(srvMsg[pwdStartIndex+1]), totalLen); - FTP_DEBUG ("PWD is %s\n", workingDir); + int srvLen = pwdEndIndex - (pwdStartIndex + 1); + int totalLen = (srvLen < wdLen) ? srvLen : wdLen; + strncpy (workingDir, &(srvMsg[pwdStartIndex+1]), totalLen); + FTP_DEBUG ("PWD is %s\n", workingDir); } } - vp_os_free (srvMsg); - return ftp_result; + vp_os_free (srvMsg); + return ftp_result; } _ftp_status ftpMkdir (_ftp_t *ftp, const char *dirName) { - _ftp_status ftp_result = FTP_FAIL; + _ftp_status ftp_result = FTP_FAIL; - if (NULL == dirName) + if (NULL == dirName) { - FTP_ERROR ("dirName must not be NULL\n"); - return FTP_FAIL; + FTP_ERROR ("dirName must not be NULL\n"); + return FTP_FAIL; } - if (NULL == ftp) + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); - return FTP_FAIL; + FTP_ERROR ("FTP not open\n"); + return FTP_FAIL; } - char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == buffer || NULL == srvMsg) + char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == buffer || NULL == srvMsg) { - FTP_ERROR ("Unable to alloc buffer\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return FTP_FAIL; + FTP_ERROR ("Unable to alloc buffer\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return FTP_FAIL; } - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "MKD %s\r\n", dirName); - ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "MKD %s\r\n", dirName); + ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending the MKD command\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + FTP_ERROR ("Error while sending the MKD command\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } - int repCode = getResponseCode (srvMsg); - if (257 != repCode) + int repCode = getResponseCode (srvMsg); + if (257 != repCode) { - FTP_ERROR ("Bad response from server (%d, expected 257)\n", repCode); - ftp_result = FTP_FAIL; + FTP_ERROR ("Bad response from server (%d, expected 257)\n", repCode); + ftp_result = FTP_FAIL; } - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } _ftp_status ftpRmdir (_ftp_t *ftp, const char *dirName) { - _ftp_status ftp_result = FTP_FAIL; + _ftp_status ftp_result = FTP_FAIL; - if (NULL == dirName) + if (NULL == dirName) { - FTP_ERROR ("dirName must not be NULL\n"); - return FTP_FAIL; + FTP_ERROR ("dirName must not be NULL\n"); + return FTP_FAIL; } - if (NULL == ftp) + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); - return FTP_FAIL; + FTP_ERROR ("FTP not open\n"); + return FTP_FAIL; } - char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); - char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); - if (NULL == buffer || NULL == srvMsg) + char *buffer = vp_os_calloc (COMMAND_BUFFER_SIZE, 1); + char *srvMsg = vp_os_calloc (MAX_SIZE_MSG, 1); + if (NULL == buffer || NULL == srvMsg) { - FTP_ERROR ("Unable to alloc buffer\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return FTP_FAIL; + FTP_ERROR ("Unable to alloc buffer\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return FTP_FAIL; } - snprintf (buffer, COMMAND_BUFFER_SIZE-1, "RMD %s\r\n", dirName); - ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); - if (FTP_FAILED (ftp_result)) + snprintf (buffer, COMMAND_BUFFER_SIZE-1, "RMD %s\r\n", dirName); + ftp_result = ftpTransfert (ftp, buffer, srvMsg, MAX_SIZE_MSG-1); + if (FTP_FAILED (ftp_result)) { - FTP_ERROR ("Error while sending the RMD command\n"); - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + FTP_ERROR ("Error while sending the RMD command\n"); + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } - int repCode = getResponseCode (srvMsg); - if (250 == repCode) // Deleted + int repCode = getResponseCode (srvMsg); + if (250 == repCode) // Deleted { - FTP_DEBUG ("Successfully deleted %s directory\n", dirName); - ftp_result = FTP_SUCCESS; + FTP_DEBUG ("Successfully deleted %s directory\n", dirName); + ftp_result = FTP_SUCCESS; } - else if (550 == repCode) // Didn't exist / not empty + else if (550 == repCode) // Didn't exist / not empty { - FTP_DEBUG ("Did not delete directory %s : did not exist or was not empty\n", dirName); - ftp_result = FTP_BADSIZE; + FTP_DEBUG ("Did not delete directory %s : did not exist or was not empty\n", dirName); + ftp_result = FTP_BADSIZE; } - else + else { - FTP_ERROR ("Bad response from server (%d, expected 250 or 550)\n", repCode); - ftp_result = FTP_FAIL; + FTP_ERROR ("Bad response from server (%d, expected 250 or 550)\n", repCode); + ftp_result = FTP_FAIL; } - vp_os_free (buffer); - vp_os_free (srvMsg); - return ftp_result; + vp_os_free (buffer); + vp_os_free (srvMsg); + return ftp_result; } _ftp_status ftpAbort (_ftp_t *ftp) { - _ftp_status retVal = FTP_FAIL; - if (NULL == ftp) + _ftp_status retVal = FTP_FAIL; + if (NULL == ftp) { - FTP_ERROR ("FTP not open\n"); + FTP_ERROR ("FTP not open\n"); } - else + else { - if (1 == ftp->opInProgress) + if (1 == ftp->opInProgress) { - ftp->abortCurrentOp = 1; - retVal = FTP_SUCCESS; + ftp->abortCurrentOp = 1; + retVal = FTP_SUCCESS; } - else + else { - retVal = FTP_SAMESIZE; + retVal = FTP_SAMESIZE; } } - return retVal; + return retVal; } diff --git a/ARDroneLib/Soft/Lib/utils/ardrone_ftp.h b/ARDroneLib/Soft/Lib/utils/ardrone_ftp.h index ecfcce7..d80dcc5 100644 --- a/ARDroneLib/Soft/Lib/utils/ardrone_ftp.h +++ b/ARDroneLib/Soft/Lib/utils/ardrone_ftp.h @@ -61,6 +61,7 @@ typedef struct _ftp_s int abortCurrentOp; _ftp_status lastStatus; char *lastFileList; + void * tag; // Allows to put any pointer to some useful data that is associated with this ftp connectionS } _ftp_t; /** diff --git a/ARDroneLib/Soft/Lib/utils/ardrone_time.c b/ARDroneLib/Soft/Lib/utils/ardrone_time.c index b02f184..370d784 100755 --- a/ARDroneLib/Soft/Lib/utils/ardrone_time.c +++ b/ARDroneLib/Soft/Lib/utils/ardrone_time.c @@ -3,16 +3,16 @@ #include #if defined(_WIN32) -#include - -static int _gettimeofday (struct timeval *tp, void *tz) -{ - struct _timeb timebuffer; - _ftime (&timebuffer); - tp->tv_sec = (long)timebuffer.time; - tp->tv_usec = (long)timebuffer.millitm * 1000; - return 0; -} + #include + + static int _gettimeofday (struct timeval *tp, void *tz) + { + struct _timeb timebuffer; + _ftime (&timebuffer); + tp->tv_sec = (long)timebuffer.time; + tp->tv_usec = (long)timebuffer.millitm * 1000; + return 0; + } #elif defined(TARGET_OS_IPHONE) || defined(TARGET_OS_SIMULATOR) #include static int _gettimeofday (struct timeval *tp, void *tz) @@ -20,13 +20,13 @@ static int _gettimeofday (struct timeval *tp, void *tz) mach_timebase_info_data_t sTimebaseInfo; uint64_t mtime = mach_absolute_time(); uint64_t useconds; - + mach_timebase_info(&sTimebaseInfo); useconds = (mtime * (sTimebaseInfo.numer / sTimebaseInfo.denom) / 1000); tp->tv_sec = (long)(useconds / 1000000); tp->tv_usec = (long)(useconds % 1000000); - + return 0; } #else @@ -36,21 +36,21 @@ static int _gettimeofday (struct timeval *tp, void *tz) C_RESULT ardrone_timer_reset(ardrone_timer_t* timer) { - vp_os_memset(timer, 0, sizeof(ardrone_timer_t)); + vp_os_memset(timer, 0, sizeof(ardrone_timer_t)); - return C_OK; + return C_OK; } C_RESULT ardrone_timer_update(ardrone_timer_t* timer) { C_RESULT retVal = C_OK; - if( timer->init == FALSE ) - { - _gettimeofday(&timer->tv_init, NULL); - timer->init = TRUE; - } + if( timer->init == FALSE ) + { + _gettimeofday(&timer->tv_init, NULL); + timer->init = TRUE; + } - _gettimeofday(&timer->tv, NULL); + _gettimeofday(&timer->tv, NULL); if (timer->tv.tv_usec >= timer->tv_init.tv_usec) { timer->tv.tv_usec -= timer->tv_init.tv_usec; @@ -69,19 +69,19 @@ C_RESULT ardrone_timer_update(ardrone_timer_t* timer) } timer->tv.tv_sec -= timer->tv_init.tv_sec; - return C_OK; + return retVal; } uint64_t ardrone_timer_elapsed_ms(ardrone_timer_t* timer) { uint64_t time; - time = -1; + time = -1; - if( timer->init ) - { + if( timer->init ) + { time = (1000ll * (uint64_t)timer->tv.tv_sec) + ((uint64_t)timer->tv.tv_usec / 1000ll); - } + } return time; } @@ -90,22 +90,22 @@ uint64_t ardrone_timer_elapsed_us(ardrone_timer_t* timer) { uint64_t time; - time = -1; + time = -1; - if( timer->init ) - { + if( timer->init ) + { time = (1000000ll * (uint64_t)timer->tv.tv_sec) + ((uint64_t)timer->tv.tv_usec); - } + } - return time; + return time; } uint64_t ardrone_timer_delta_ms(ardrone_timer_t* timer) { - ardrone_timer_t timer_current; + ardrone_timer_t timer_current; - timer_current.init = TRUE; - timer_current.tv_init = timer->tv_init; + timer_current.init = TRUE; + timer_current.tv_init = timer->tv_init; uint64_t retVal = 0; if (C_OK == ardrone_timer_update(&timer_current)) @@ -118,16 +118,16 @@ uint64_t ardrone_timer_delta_ms(ardrone_timer_t* timer) uint64_t ardrone_timer_delta_us(ardrone_timer_t* timer) { - ardrone_timer_t timer_current; - - timer_current.init = TRUE; - timer_current.tv_init = timer->tv_init; - + ardrone_timer_t timer_current; + + timer_current.init = TRUE; + timer_current.tv_init = timer->tv_init; + uint64_t retVal = 0; if (C_OK == ardrone_timer_update(&timer_current)) { retVal = ardrone_timer_elapsed_us(&timer_current) - ardrone_timer_elapsed_us(timer); - } +} return retVal; } diff --git a/ARDroneLib/Soft/Lib/utils/ardrone_time.h b/ARDroneLib/Soft/Lib/utils/ardrone_time.h index ffd6891..da97b82 100755 --- a/ARDroneLib/Soft/Lib/utils/ardrone_time.h +++ b/ARDroneLib/Soft/Lib/utils/ardrone_time.h @@ -7,6 +7,9 @@ #include +#define ARDRONE_TIME_SEC_TO_MSEC(x) ((x)*1000.f) +#define ARDRONE_TIME_MSEC_TO_SEC(x) ((x)/1000.f) + typedef struct _ardrone_timer_t { bool_t init; diff --git a/ARDroneLib/Soft/Lib/utils/ardrone_video_atoms.c b/ARDroneLib/Soft/Lib/utils/ardrone_video_atoms.c index a43f3e0..87f13dd 100644 --- a/ARDroneLib/Soft/Lib/utils/ardrone_video_atoms.c +++ b/ARDroneLib/Soft/Lib/utils/ardrone_video_atoms.c @@ -84,49 +84,51 @@ movie_atom_t *atomFromData (uint32_t data_size, const char *_tag, const uint8_t *_data) { - movie_atom_t *retAtom = ATOM_MALLOC (sizeof (movie_atom_t)); - if (NULL == retAtom) + movie_atom_t *retAtom = ATOM_MALLOC (sizeof (movie_atom_t)); + if (NULL == retAtom) { - return retAtom; + return retAtom; } - retAtom->size = data_size + 8; - strncpy (retAtom->tag, _tag, 4); + retAtom->size = data_size + 8; + strncpy (retAtom->tag, _tag, 4); - retAtom->data = NULL; - if (NULL != _data && data_size > 0) + retAtom->data = NULL; + if (NULL != _data && data_size > 0) { - retAtom->data = ATOM_MALLOC (data_size); - if (NULL == retAtom->data) + retAtom->data = ATOM_MALLOC (data_size); + if (NULL == retAtom->data) { - ATOM_FREE (retAtom); - return NULL; + ATOM_FREE (retAtom); + retAtom = NULL; + return NULL; } - ATOM_MEMCOPY (retAtom->data, _data, data_size); + ATOM_MEMCOPY (retAtom->data, _data, data_size); } - retAtom->wide = 0; - return retAtom; + retAtom->wide = 0; + return retAtom; } void insertAtomIntoAtom (movie_atom_t *container, movie_atom_t **leaf) { - uint32_t new_container_size = container->size - 8 + (*leaf)->size; - container->data = ATOM_REALLOC (container->data, new_container_size); - if (NULL == container->data) + uint32_t new_container_size = container->size - 8 + (*leaf)->size; + container->data = ATOM_REALLOC (container->data, new_container_size); + if (NULL == container->data) { - fprintf (stderr, "Alloc error for atom insertion\n"); - return; + fprintf (stderr, "Alloc error for atom insertion\n"); + return; } - uint32_t leafSizeNetworkEndian = htonl ((*leaf)->size); - ATOM_MEMCOPY (&container->data[container->size - 8], &leafSizeNetworkEndian, sizeof (uint32_t)); - ATOM_MEMCOPY (&container->data[container->size - 4], (*leaf)->tag, 4); - if (NULL != (*leaf)->data) + uint32_t leafSizeNetworkEndian = htonl ((*leaf)->size); + ATOM_MEMCOPY (&container->data[container->size - 8], &leafSizeNetworkEndian, sizeof (uint32_t)); + ATOM_MEMCOPY (&container->data[container->size - 4], (*leaf)->tag, 4); + if (NULL != (*leaf)->data) { - ATOM_MEMCOPY (&container->data[container->size], (*leaf)->data, ((*leaf)->size - 8)); - container->size = new_container_size + 8; + ATOM_MEMCOPY (&container->data[container->size], (*leaf)->data, ((*leaf)->size - 8)); + container->size = new_container_size + 8; } - ATOM_FREE ((*leaf)->data); - ATOM_FREE (*leaf); - *leaf = NULL; + ATOM_FREE ((*leaf)->data); + (*leaf)->data = NULL; + ATOM_FREE (*leaf); + *leaf = NULL; } int writeAtomToFile (movie_atom_t **_atom, FILE *file) @@ -135,108 +137,123 @@ int writeAtomToFile (movie_atom_t **_atom, FILE *file) { return -1; } - uint32_t networkEndianSize = htonl ((*_atom)->size); - if (4 != fwrite (&networkEndianSize, 1, 4, file)) + uint32_t networkEndianSize = htonl ((*_atom)->size); + if (4 != fwrite (&networkEndianSize, 1, 4, file)) { - return -1; + return -1; } - if (4 != fwrite ((*_atom)->tag, 1, 4, file)) + if (4 != fwrite ((*_atom)->tag, 1, 4, file)) { - return -1; + return -1; } - if (NULL != (*_atom)->data) + if (NULL != (*_atom)->data) { - uint32_t atom_data_size = 0; - if (1 == (*_atom)->wide) + uint32_t atom_data_size = 0; + if (1 == (*_atom)->wide) { - atom_data_size = 8; + atom_data_size = 8; } - else + else { - atom_data_size = (*_atom)->size - 8; + atom_data_size = (*_atom)->size - 8; } - if (atom_data_size != fwrite ((*_atom)->data, 1, atom_data_size, file)) + if (atom_data_size != fwrite ((*_atom)->data, 1, atom_data_size, file)) { - return -1; + return -1; } } - ATOM_FREE ((*_atom)->data); - ATOM_FREE (*_atom); - *_atom = NULL; + ATOM_FREE ((*_atom)->data); + (*_atom)->data = NULL; + ATOM_FREE (*_atom); + *_atom = NULL; + + return 0; +} - return 0; +void freeAtom (movie_atom_t **_atom) +{ + if ((NULL != _atom) && + (NULL != *_atom)) + { + if (NULL != (*_atom)->data) + { + ATOM_FREE ((*_atom)->data); + } + ATOM_FREE (*_atom); + *_atom = NULL; + } } movie_atom_t *ftypAtomForFormatAndCodecWithOffset (ardrone_video_type_t format, parrot_video_encapsulation_codecs_t codec, uint32_t *offset, movie_atom_t **wideAtom) { - if (NULL == offset || NULL == wideAtom) + if (NULL == offset || NULL == wideAtom) { - return NULL; + return NULL; } - movie_atom_t *retAtom = NULL; - if (ARDRONE_VIDEO_MP4 == format) - { + movie_atom_t *retAtom = NULL; + if (ARDRONE_VIDEO_MP4 == format) + { uint8_t data [24] = {'i', 's', 'o', 'm', - 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 'i', 's', 'o', 'm', 'i', 's', 'o', '2', 'a', 'v', 'c', '1', - 'm', 'p', '4', '1'}; - retAtom = atomFromData (24, "ftyp", data); - *offset = 48; - } - else if (ARDRONE_VIDEO_MOV == format) + 'm', 'p', '4', '1'}; + retAtom = atomFromData (24, "ftyp", data); + *offset = 48; + } + else if (ARDRONE_VIDEO_MOV == format) { uint8_t data [12] = {'q', 't', ' ', ' ', - 0x00, 0x00, 0x02, 0x00, - 'q', 't', ' ', ' '}; - retAtom = atomFromData (12, "ftyp", data); - uint8_t wideData [4] = {0}; - *wideAtom = atomFromData (4, "wide", wideData); - *offset = 48; + 0x00, 0x00, 0x02, 0x00, + 'q', 't', ' ', ' '}; + retAtom = atomFromData (12, "ftyp", data); + uint8_t wideData [4] = {0}; + *wideAtom = atomFromData (4, "wide", wideData); + *offset = 48; } - return retAtom; + return retAtom; } movie_atom_t *mdatAtomForFormatWithVideoSize (ardrone_video_type_t format, uint64_t videoSize) { - movie_atom_t *retAtom = NULL; - if (videoSize <= INT32_MAX) + movie_atom_t *retAtom = NULL; + if (videoSize <= INT32_MAX) { - // Free/wide atom + mdat - uint8_t data [8] = {0x00, 0x00, 0x00, 0x00, - 'm', 'd', 'a', 't'}; - uint32_t sizeNe = htonl ((uint32_t) videoSize); - ATOM_MEMCOPY (data, &sizeNe, sizeof (uint32_t)); - if (ARDRONE_VIDEO_MP4 == format) + // Free/wide atom + mdat + uint8_t data [8] = {0x00, 0x00, 0x00, 0x00, + 'm', 'd', 'a', 't'}; + uint32_t sizeNe = htonl ((uint32_t) videoSize); + ATOM_MEMCOPY (data, &sizeNe, sizeof (uint32_t)); + if (ARDRONE_VIDEO_MP4 == format) { - retAtom = atomFromData (8, "free", data); - retAtom->size = 8; - retAtom->wide = 1; + retAtom = atomFromData (8, "free", data); + retAtom->size = 8; + retAtom->wide = 1; } - else + else { - retAtom = atomFromData (8, "wide", data); - retAtom->size = 8; - retAtom->wide = 1; + retAtom = atomFromData (8, "wide", data); + retAtom->size = 8; + retAtom->wide = 1; } } - else + else { - // 64bit wide mdat atom - uint8_t data [8] = {0}; - uint32_t highSize = (videoSize >> 32); + // 64bit wide mdat atom + uint8_t data [8] = {0}; + uint32_t highSize = (videoSize >> 32); uint32_t lowSize = (videoSize & 0xffffffff); - uint32_t highSizeNe = htonl (highSize); - uint32_t lowSizeNe = htonl (lowSize); - ATOM_MEMCOPY (data, &highSizeNe, sizeof (uint32_t)); - ATOM_MEMCOPY (&data[4], &lowSizeNe, sizeof (uint32_t)); - retAtom = atomFromData (8, "mdat", data); - retAtom->size = 0; - retAtom->wide = 1; + uint32_t highSizeNe = htonl (highSize); + uint32_t lowSizeNe = htonl (lowSize); + ATOM_MEMCOPY (data, &highSizeNe, sizeof (uint32_t)); + ATOM_MEMCOPY (&data[4], &lowSizeNe, sizeof (uint32_t)); + retAtom = atomFromData (8, "mdat", data); + retAtom->size = 0; + retAtom->wide = 1; } - return retAtom; + return retAtom; } movie_atom_t *mvhdAtomFromFpsNumFramesAndDate (uint32_t fps, uint32_t nbFrames, time_t date) @@ -280,6 +297,7 @@ movie_atom_t *mvhdAtomFromFpsNumFramesAndDate (uint32_t fps, uint32_t nbFrames, movie_atom_t *retAtom = atomFromData (100, "mvhd", data); ATOM_FREE (data); + data = NULL; return retAtom; } @@ -321,6 +339,7 @@ movie_atom_t *tkhdAtomWithResolutionNumFramesFpsAndDate (uint32_t w, uint32_t h, movie_atom_t *retAtom = atomFromData (84, "tkhd", data); ATOM_FREE (data); + data = NULL; return retAtom; } @@ -343,278 +362,281 @@ movie_atom_t *mdhdAtomFromFpsNumFramesAndDate (uint32_t fps, uint32_t nbFrames, movie_atom_t *retAtom = atomFromData (24, "mdhd", data); ATOM_FREE (data); + data = NULL; return retAtom; } movie_atom_t *hdlrAtomForMdia () { - uint8_t data [37] = {0x00, 0x00, 0x00, 0x00, - 'm', 'h', 'l', 'r', - 'v', 'i', 'd', 'e', - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x0c, 'V', 'i', 'd', - 'e', 'o', 'H', 'a', - 'n', 'd', 'l', 'e', - 'r'}; - return atomFromData (37, "hdlr", data); + uint8_t data [37] = {0x00, 0x00, 0x00, 0x00, + 'm', 'h', 'l', 'r', + 'v', 'i', 'd', 'e', + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x0c, 'V', 'i', 'd', + 'e', 'o', 'H', 'a', + 'n', 'd', 'l', 'e', + 'r'}; + return atomFromData (37, "hdlr", data); } movie_atom_t *vmhdAtomGen () { - uint8_t data [12] = {0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; - return atomFromData (12, "vmhd", data); + uint8_t data [12] = {0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; + return atomFromData (12, "vmhd", data); } movie_atom_t *hdlrAtomForMinf () { - uint8_t data [36] = {0x00, 0x00, 0x00, 0x00, - 'd', 'h', 'l', 'r', - 'u', 'r', 'l', ' ', - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x0b, 'D', 'a', 't', - 'a', 'H', 'a', 'n', - 'd', 'l', 'e', 'r'}; - return atomFromData (36, "hdlr", data); + uint8_t data [36] = {0x00, 0x00, 0x00, 0x00, + 'd', 'h', 'l', 'r', + 'u', 'r', 'l', ' ', + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x0b, 'D', 'a', 't', + 'a', 'H', 'a', 'n', + 'd', 'l', 'e', 'r'}; + return atomFromData (36, "hdlr", data); } movie_atom_t *drefAtomGen () { - uint8_t data [20] = {0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x0C, - 0x75, 0x72, 0x6c, 0x20, - 0x00, 0x00, 0x00, 0x01}; - return atomFromData (20, "dref", data); + uint8_t data [20] = {0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x0C, + 0x75, 0x72, 0x6c, 0x20, + 0x00, 0x00, 0x00, 0x01}; + return atomFromData (20, "dref", data); } movie_atom_t *stsdAtomWithResolutionAndCodec (uint32_t w, uint32_t h, parrot_video_encapsulation_codecs_t codec) { - if (CODEC_MPEG4_AVC == codec) + if (CODEC_MPEG4_AVC == codec) { - uint8_t data [128] = {0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x78, - 'a', 'v', 'c', '1', // vse type - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, - 'A', 'R', '.', 'D', // Muxer string - 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00,// 40 -> width | 42 -> height - 0x00, 0x48, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, - 0xff, 0xff, 0x00, 0x00, - 0x00, 0x22, 0x61, 0x76, - 0x63, 0x43, 0x01, 0x42, - 0x80, 0x1e, 0xff, 0xe1, - 0x00, 0x09, 0x67, 0x42, - 0x80, 0x1e, 0x8b, 0x68, - 0x0a, 0x02, 0xf1, 0x01, - 0x00, 0x06, 0x68, 0xce, - 0x01, 0xa8, 0x77, 0x20}; - uint16_t neW = htons ((uint16_t) w); - uint16_t neH = htons ((uint16_t) h); - ATOM_MEMCOPY(&data[40], &neW, sizeof (uint16_t)); - ATOM_MEMCOPY(&data[42], &neH, sizeof (uint16_t)); - return atomFromData (128, "stsd", data); + uint8_t data [128] = {0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x78, + 'a', 'v', 'c', '1', // vse type + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, + 'A', 'R', '.', 'D', // Muxer string + 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00,// 40 -> width | 42 -> height + 0x00, 0x48, 0x00, 0x00, + 0x00, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, + 0xff, 0xff, 0x00, 0x00, + 0x00, 0x22, 0x61, 0x76, + 0x63, 0x43, 0x01, 0x42, + 0x80, 0x1e, 0xff, 0xe1, + 0x00, 0x09, 0x67, 0x42, + 0x80, 0x1e, 0x8b, 0x68, + 0x0a, 0x02, 0xf1, 0x01, + 0x00, 0x06, 0x68, 0xce, + 0x01, 0xa8, 0x77, 0x20}; + uint16_t neW = htons ((uint16_t) w); + uint16_t neH = htons ((uint16_t) h); + ATOM_MEMCOPY(&data[40], &neW, sizeof (uint16_t)); + ATOM_MEMCOPY(&data[42], &neH, sizeof (uint16_t)); + return atomFromData (128, "stsd", data); } - else if (CODEC_MPEG4_VISUAL == codec) + else if (CODEC_MPEG4_VISUAL == codec) { - uint8_t data [187] = {0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0xb3, - 'm', 'p', '4', 'v', // vse type - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, - 'A', 'R', '.', 'D', // Muxer string - 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00,// 40 -> width | 42 -> height - 0x00, 0x48, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x05, 'm', - 'p', 'e', 'g', '4', - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, - 0xff, 0xff, 0x00, 0x00, - 0x00, 0x5d, 0x65, 0x73, - 0x64, 0x73, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x80, - 0x80, 0x80, 0x4c, 0x00, - 0x01, 0x00, 0x04, 0x80, - 0x80, 0x80, 0x3e, 0x20, - 0x11, 0x00, 0x00, 0x00, - 0x00, 0x07, 0xac, 0xda, - 0x00, 0x07, 0xac, 0xda, - 0x05, 0x80, 0x80, 0x80, - 0x2c, 0x00, 0x00, 0x01, - 0xb0, 0x01, 0x00, 0x00, - 0x01, 0xb5, 0x89, 0x13, - 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x20, - 0x00, 0xc4, 0x8d, 0x88, - 0x00, 0xf5, 0x14, 0x04, - 0x2e, 0x14, 0x63, 0x00, - 0x00, 0x01, 0xb2, 'A', - 'R', '.', 'D', 'r', - 'o', 'n', 'e', '_', - '2', 0x06, 0x80, 0x80, - 0x80, 0x01, 0x02}; - uint16_t neW = htons ((uint16_t) w); - uint16_t neH = htons ((uint16_t) h); - ATOM_MEMCOPY(&data[40], &neW, sizeof (uint16_t)); - ATOM_MEMCOPY(&data[42], &neH, sizeof (uint16_t)); - return atomFromData (187, "stsd", data); + uint8_t data [187] = {0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0xb3, + 'm', 'p', '4', 'v', // vse type + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, + 'A', 'R', '.', 'D', // Muxer string + 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00,// 40 -> width | 42 -> height + 0x00, 0x48, 0x00, 0x00, + 0x00, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 'm', + 'p', 'e', 'g', '4', + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, + 0xff, 0xff, 0x00, 0x00, + 0x00, 0x5d, 0x65, 0x73, + 0x64, 0x73, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x80, + 0x80, 0x80, 0x4c, 0x00, + 0x01, 0x00, 0x04, 0x80, + 0x80, 0x80, 0x3e, 0x20, + 0x11, 0x00, 0x00, 0x00, + 0x00, 0x07, 0xac, 0xda, + 0x00, 0x07, 0xac, 0xda, + 0x05, 0x80, 0x80, 0x80, + 0x2c, 0x00, 0x00, 0x01, + 0xb0, 0x01, 0x00, 0x00, + 0x01, 0xb5, 0x89, 0x13, + 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x20, + 0x00, 0xc4, 0x8d, 0x88, + 0x00, 0xf5, 0x14, 0x04, + 0x2e, 0x14, 0x63, 0x00, + 0x00, 0x01, 0xb2, 'A', + 'R', '.', 'D', 'r', + 'o', 'n', 'e', '_', + '2', 0x06, 0x80, 0x80, + 0x80, 0x01, 0x02}; + uint16_t neW = htons ((uint16_t) w); + uint16_t neH = htons ((uint16_t) h); + ATOM_MEMCOPY(&data[40], &neW, sizeof (uint16_t)); + ATOM_MEMCOPY(&data[42], &neH, sizeof (uint16_t)); + return atomFromData (187, "stsd", data); } - else + else { - return atomFromData (0, "stsd", NULL); + return atomFromData (0, "stsd", NULL); } } movie_atom_t *stsdAtomWithResolutionCodecSpsAndPps (uint32_t w, uint32_t h, parrot_video_encapsulation_codecs_t codec, uint8_t *sps, uint32_t spsSize, uint8_t *pps, uint32_t ppsSize) { - if (NULL == sps || NULL == pps || CODEC_MPEG4_AVC != codec) + if (NULL == sps || NULL == pps || CODEC_MPEG4_AVC != codec) { - return stsdAtomWithResolutionAndCodec (w, h, codec); + return stsdAtomWithResolutionAndCodec (w, h, codec); } - uint32_t avcCSize = 19 + spsSize + ppsSize; - uint32_t vse_size = avcCSize + 86; - uint32_t dataSize = vse_size + 8; - uint8_t *data = ATOM_MALLOC (dataSize); - if (NULL == data) + uint32_t avcCSize = 19 + spsSize + ppsSize; + uint32_t vse_size = avcCSize + 86; + uint32_t dataSize = vse_size + 8; + uint8_t *data = ATOM_MALLOC (dataSize); + if (NULL == data) { - return NULL; + return NULL; } - uint32_t currentIndex = 0; - ATOM_WRITE_U32 (0); /* version / flags */ - ATOM_WRITE_U32 (1); /* entry count */ - ATOM_WRITE_U32 (vse_size); /* video sample entry size */ - ATOM_WRITE_4CC ('a', 'v', 'c', '1'); /* VSE type */ - ATOM_WRITE_U32 (0); /* Reserved */ - ATOM_WRITE_U16 (0); /* Reserved */ - ATOM_WRITE_U16 (1); /* Data reference index */ - ATOM_WRITE_U16 (0); /* Codec stream version */ - ATOM_WRITE_U16 (0); /* Codec stream revision */ - ATOM_WRITE_4CC ('A', 'R', '.', 'D'); /* Muxer name */ - ATOM_WRITE_U32 (0x200); /* Temporal quality */ - ATOM_WRITE_U32 (0x200); /* Spatial quality */ - ATOM_WRITE_U16 (w); /* Width */ - ATOM_WRITE_U16 (h); /* Height */ - ATOM_WRITE_U32 (0x00480000); /* Horiz DPI : 72dpi */ - ATOM_WRITE_U32 (0x00480000); /* Vert DPI : 72dpi */ - ATOM_WRITE_U32 (0); /* Data size */ - ATOM_WRITE_U16 (1); /* Frame count */ - ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ - ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ - ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ - ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ - ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ - ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ - ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ - ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ - ATOM_WRITE_U16 (0x18); /* Reserved */ - ATOM_WRITE_U16 (0xffff); /* Reserved */ - /* avcC tag */ - ATOM_WRITE_U32 (avcCSize); /* Size */ - ATOM_WRITE_4CC ('a', 'v', 'c', 'C'); /* avcC header */ - ATOM_WRITE_U8 (1); /* version */ - ATOM_WRITE_U8 (sps[1]); /* profile */ - ATOM_WRITE_U8 (sps[2]); /* profile compat */ - ATOM_WRITE_U8 (sps[3]); /* level */ - ATOM_WRITE_U8 (0xff); /* Reserved (6bits) -- NAL size length - 1 (2bits) */ - ATOM_WRITE_U8 (0xe1); /* Reserved (3 bits) -- Number of SPS (5 bits) */ - ATOM_WRITE_U16 (spsSize); /* Size of SPS */ - ATOM_WRITE_BYTES (sps, spsSize); /* SPS header */ - ATOM_WRITE_U8 (1); /* Number of PPS */ - ATOM_WRITE_U16 (ppsSize); /* Size of PPS */ - ATOM_WRITE_BYTES (pps, ppsSize); /* PPS Header */ + uint32_t currentIndex = 0; + ATOM_WRITE_U32 (0); /* version / flags */ + ATOM_WRITE_U32 (1); /* entry count */ + ATOM_WRITE_U32 (vse_size); /* video sample entry size */ + ATOM_WRITE_4CC ('a', 'v', 'c', '1'); /* VSE type */ + ATOM_WRITE_U32 (0); /* Reserved */ + ATOM_WRITE_U16 (0); /* Reserved */ + ATOM_WRITE_U16 (1); /* Data reference index */ + ATOM_WRITE_U16 (0); /* Codec stream version */ + ATOM_WRITE_U16 (0); /* Codec stream revision */ + ATOM_WRITE_4CC ('A', 'R', '.', 'D'); /* Muxer name */ + ATOM_WRITE_U32 (0x200); /* Temporal quality */ + ATOM_WRITE_U32 (0x200); /* Spatial quality */ + ATOM_WRITE_U16 (w); /* Width */ + ATOM_WRITE_U16 (h); /* Height */ + ATOM_WRITE_U32 (0x00480000); /* Horiz DPI : 72dpi */ + ATOM_WRITE_U32 (0x00480000); /* Vert DPI : 72dpi */ + ATOM_WRITE_U32 (0); /* Data size */ + ATOM_WRITE_U16 (1); /* Frame count */ + ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ + ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ + ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ + ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ + ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ + ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ + ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ + ATOM_WRITE_U32 (0); /* Compressor name ... 32 octets of zeros */ + ATOM_WRITE_U16 (0x18); /* Reserved */ + ATOM_WRITE_U16 (0xffff); /* Reserved */ + /* avcC tag */ + ATOM_WRITE_U32 (avcCSize); /* Size */ + ATOM_WRITE_4CC ('a', 'v', 'c', 'C'); /* avcC header */ + ATOM_WRITE_U8 (1); /* version */ + ATOM_WRITE_U8 (sps[1]); /* profile */ + ATOM_WRITE_U8 (sps[2]); /* profile compat */ + ATOM_WRITE_U8 (sps[3]); /* level */ + ATOM_WRITE_U8 (0xff); /* Reserved (6bits) -- NAL size length - 1 (2bits) */ + ATOM_WRITE_U8 (0xe1); /* Reserved (3 bits) -- Number of SPS (5 bits) */ + ATOM_WRITE_U16 (spsSize); /* Size of SPS */ + ATOM_WRITE_BYTES (sps, spsSize); /* SPS header */ + ATOM_WRITE_U8 (1); /* Number of PPS */ + ATOM_WRITE_U16 (ppsSize); /* Size of PPS */ + ATOM_WRITE_BYTES (pps, ppsSize); /* PPS Header */ - movie_atom_t *retAtom = atomFromData (dataSize, "stsd", data); - ATOM_FREE (data); - return retAtom; + movie_atom_t *retAtom = atomFromData (dataSize, "stsd", data); + ATOM_FREE (data); + data = NULL; + return retAtom; } movie_atom_t *sttsAtomWithNumFrames (uint32_t nbFrames) { - uint8_t data [16] = {0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01}; - uint32_t networkEndianFrames = htonl (nbFrames); - ATOM_MEMCOPY( &data[8], &networkEndianFrames, sizeof (uint32_t)); - return atomFromData (16, "stts", data); + uint8_t data [16] = {0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01}; + uint32_t networkEndianFrames = htonl (nbFrames); + ATOM_MEMCOPY( &data[8], &networkEndianFrames, sizeof (uint32_t)); + return atomFromData (16, "stts", data); } movie_atom_t *stscAtomGen () { - uint8_t data [20] = {0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01}; - return atomFromData (20, "stsc", data); + uint8_t data [20] = {0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01}; + return atomFromData (20, "stsc", data); } movie_atom_t *metadataAtomFromTagAndValue (const char *tag, const char *value) { - movie_atom_t *retAtom = NULL; - char locTag [4] = {0}; - /* If tag have a length of 3 chars, the (c) sign is added by this function */ - if (3 == strlen (tag)) + movie_atom_t *retAtom = NULL; + char locTag [4] = {0}; + /* If tag have a length of 3 chars, the (c) sign is added by this function */ + if (3 == strlen (tag)) { - locTag[0] = '\251'; // (c) sign - strncpy (&locTag[1], tag, 3); + locTag[0] = '\251'; // (c) sign + strncpy (&locTag[1], tag, 3); } - /* Custom tag */ - else if (4 == strlen (tag)) + /* Custom tag */ + else if (4 == strlen (tag)) { - strncpy (locTag, tag, 4); + strncpy (locTag, tag, 4); } - - /* Continue only if we got a valid tag */ - if (0 != locTag [0]) + + /* Continue only if we got a valid tag */ + if (0 != locTag [0]) { - uint16_t valLen = (uint16_t) strlen (value); - uint16_t langCode = 0x55c4; /* 5-bit ascii for "und", undefined */ - uint32_t currentIndex = 0; - uint32_t dataSize = valLen + 4; - uint8_t *data = ATOM_MALLOC (dataSize); - if (NULL != data) + uint16_t valLen = (uint16_t) strlen (value); + uint16_t langCode = 0x55c4; /* 5-bit ascii for "und", undefined */ + uint32_t currentIndex = 0; + uint32_t dataSize = valLen + 4; + uint8_t *data = ATOM_MALLOC (dataSize); + if (NULL != data) { - ATOM_WRITE_U16 (valLen); /* Length of the value field */ - ATOM_WRITE_U16 (langCode); /* Language code, set to "und" (undefined) */ - ATOM_WRITE_BYTES (value, valLen); /* Actual value */ - retAtom = atomFromData (dataSize, locTag, data); - ATOM_FREE (data); + ATOM_WRITE_U16 (valLen); /* Length of the value field */ + ATOM_WRITE_U16 (langCode); /* Language code, set to "und" (undefined) */ + ATOM_WRITE_BYTES (value, valLen); /* Actual value */ + retAtom = atomFromData (dataSize, locTag, data); + ATOM_FREE (data); + data = NULL; } } - return retAtom; + return retAtom; } movie_atom_t *ardtAtomFromPathAndDroneVersion(const char *path, uint8_t droneVersion) @@ -627,14 +649,14 @@ movie_atom_t *ardtAtomFromPathAndDroneVersion(const char *path, uint8_t droneVer { pathLength = strlen(path); } - + uint32_t dataSize = pathLength + versionStringLen + 4; // 2 for version + 2 for string size without '\0' uint8_t *data = ATOM_MALLOC(dataSize); if (NULL != data) { uint32_t currentIndex = 0; - + ATOM_WRITE_U16 (0); /* Version */ ATOM_WRITE_U16 (pathLength + versionStringLen); /* length of string */ ATOM_WRITE_U8 ('0' + ((droneVersion / 100) % 10)); /* Drone version number */ @@ -647,8 +669,9 @@ movie_atom_t *ardtAtomFromPathAndDroneVersion(const char *path, uint8_t droneVer } retAtom = atomFromData (dataSize, "ardt", data); ATOM_FREE (data); + data = NULL; } // NO ELSE - malloc failed - + return retAtom; } diff --git a/ARDroneLib/Soft/Lib/utils/ardrone_video_atoms.h b/ARDroneLib/Soft/Lib/utils/ardrone_video_atoms.h index 50ca892..207f96b 100644 --- a/ARDroneLib/Soft/Lib/utils/ardrone_video_atoms.h +++ b/ARDroneLib/Soft/Lib/utils/ardrone_video_atoms.h @@ -61,6 +61,7 @@ ardt -> specific movie_atom_t *atomFromData (uint32_t data_size, const char *_tag, const uint8_t *_data); void insertAtomIntoAtom (movie_atom_t *container, movie_atom_t **leaf); // will free leaf int writeAtomToFile (movie_atom_t **_atom, FILE *file); // Will free _atom +void freeAtom (movie_atom_t **_atom); /* SPECIFIC */ movie_atom_t *ftypAtomForFormatAndCodecWithOffset (ardrone_video_type_t format, parrot_video_encapsulation_codecs_t codec, uint32_t *offset, movie_atom_t **freeAtom); diff --git a/ARDroneLib/Soft/Lib/utils/ardrone_video_encapsuler.c b/ARDroneLib/Soft/Lib/utils/ardrone_video_encapsuler.c index af9a645..fcbc649 100644 --- a/ARDroneLib/Soft/Lib/utils/ardrone_video_encapsuler.c +++ b/ARDroneLib/Soft/Lib/utils/ardrone_video_encapsuler.c @@ -28,10 +28,15 @@ #include #else #include +#ifndef USE_ANDROID #include // For file cleanup in subdirs +#else +#include +#endif #endif #define ENCAPSULER_SMALL_STRING_SIZE (30) +#define ENCAPSULER_INFODATA_MAX_SIZE (256) /* The structure is initialised to an invalid value so we won't set any position in videos unless we got a @@ -141,6 +146,7 @@ ardrone_video_t *ardrone_video_start (const char *videoPath, int fps, ardrone_vi *error = ARDRONE_VIDEO_GENERIC_ERROR; vp_os_mutex_unlock(&retVideo->mutex); vp_os_free (retVideo); + retVideo = NULL; return NULL; } @@ -160,6 +166,7 @@ ardrone_video_t *ardrone_video_start (const char *videoPath, int fps, ardrone_vi fclose (retVideo->infoFile); vp_os_mutex_unlock(&retVideo->mutex); vp_os_free (retVideo); + retVideo = NULL; return NULL; } retVideo->framesCount = 0; @@ -270,8 +277,16 @@ ardrone_video_error_t ardrone_video_addFrame (ardrone_video_t *video, uint8_t *f if (NULL == video->sps || NULL == video->pps) { ENCAPSULER_ERROR ("Unable to allocate SPS/PPS buffers"); - if (NULL != video->sps) vp_os_free (video->sps); - if (NULL != video->pps) vp_os_free (video->pps); + if (NULL != video->sps) + { + vp_os_free (video->sps); + video->sps = NULL; + } + if (NULL != video->pps) + { + vp_os_free (video->pps); + video->pps = NULL; + } vp_os_mutex_unlock(&video->mutex); return ARDRONE_VIDEO_GENERIC_ERROR; } @@ -290,6 +305,7 @@ ardrone_video_error_t ardrone_video_addFrame (ardrone_video_t *video, uint8_t *f if (NULL != freeAtomIfNeeded) { vp_os_free (freeAtomIfNeeded); + freeAtomIfNeeded = NULL; } return ARDRONE_VIDEO_GENERIC_ERROR; } @@ -300,6 +316,7 @@ ardrone_video_error_t ardrone_video_addFrame (ardrone_video_t *video, uint8_t *f if (NULL != freeAtomIfNeeded) { vp_os_free (freeAtomIfNeeded); + freeAtomIfNeeded = NULL; } return ARDRONE_VIDEO_FILE_ERROR; } @@ -356,7 +373,7 @@ ardrone_video_error_t ardrone_video_addFrame (ardrone_video_t *video, uint8_t *f } } -// Normal operation : file pointer is at end of file + // Normal operation : file pointer is at end of file if (video->videoCodec != PaVE->video_codec || video->width != PaVE->display_width || video->height != PaVE->display_height) @@ -386,7 +403,7 @@ ardrone_video_error_t ardrone_video_addFrame (ardrone_video_t *video, uint8_t *f return ARDRONE_VIDEO_GENERIC_ERROR; } vp_os_memcpy (myData, data, frameSize); -// Modify frames before writing + // Modify frames before writing if (FRAME_TYPE_I_FRAME != PaVE->frame_type && FRAME_TYPE_IDR_FRAME != PaVE->frame_type) { @@ -418,6 +435,7 @@ ardrone_video_error_t ardrone_video_addFrame (ardrone_video_t *video, uint8_t *f if (frameSize != fwrite (myData, 1, frameSize, video->outFile)) { vp_os_free (myData); + myData = NULL; ENCAPSULER_ERROR ("Unable to write frame into data file"); vp_os_mutex_unlock(&video->mutex); return ARDRONE_VIDEO_FILE_ERROR; @@ -427,15 +445,16 @@ ardrone_video_error_t ardrone_video_addFrame (ardrone_video_t *video, uint8_t *f ENCAPSULER_FFLUSH (video->outFile); } vp_os_free (myData); + myData = NULL; - char infoData [50] = {0}; + char infoData [ENCAPSULER_INFODATA_MAX_SIZE] = {0}; char fTypeChar = 'p'; if (FRAME_TYPE_I_FRAME == PaVE->frame_type || FRAME_TYPE_IDR_FRAME == PaVE->frame_type) { fTypeChar = 'i'; } - snprintf (infoData, 50, ARDRONE_VIDEO_INFO_PATTERN, frameSize, fTypeChar); + snprintf (infoData, ENCAPSULER_INFODATA_MAX_SIZE, ARDRONE_VIDEO_INFO_PATTERN, frameSize, fTypeChar); uint32_t infoLen = strlen (infoData); if (infoLen != fwrite (infoData, 1, infoLen, video->infoFile)) { @@ -552,8 +571,17 @@ ardrone_video_error_t ardrone_video_addSlice (ardrone_video_t *video, uint8_t *s if (NULL == video->sps || NULL == video->pps) { ENCAPSULER_ERROR ("Unable to allocate SPS/PPS buffers"); - if (NULL != video->sps) vp_os_free (video->sps); - if (NULL != video->pps) vp_os_free (video->pps); + if (NULL != video->sps) + { + vp_os_free (video->sps); + video->sps = NULL; + } + + if (NULL != video->pps) + { + vp_os_free (video->pps); + video->pps = NULL; + } vp_os_mutex_unlock(&video->mutex); return ARDRONE_VIDEO_GENERIC_ERROR; } @@ -572,6 +600,7 @@ ardrone_video_error_t ardrone_video_addSlice (ardrone_video_t *video, uint8_t *s if (NULL != freeAtomIfNeeded) { vp_os_free (freeAtomIfNeeded); + freeAtomIfNeeded = NULL; } return ARDRONE_VIDEO_GENERIC_ERROR; } @@ -582,6 +611,7 @@ ardrone_video_error_t ardrone_video_addSlice (ardrone_video_t *video, uint8_t *s if (NULL != freeAtomIfNeeded) { vp_os_free (freeAtomIfNeeded); + freeAtomIfNeeded = NULL; } return ARDRONE_VIDEO_FILE_ERROR; } @@ -655,14 +685,14 @@ ardrone_video_error_t ardrone_video_addSlice (ardrone_video_t *video, uint8_t *s { if (FRAME_TYPE_UNKNNOWN != video->lastFrameType) { - char infoData [50] = {0}; + char infoData [ENCAPSULER_INFODATA_MAX_SIZE] = {0}; char fTypeChar = 'p'; if (FRAME_TYPE_I_FRAME == video->lastFrameType || FRAME_TYPE_IDR_FRAME == video->lastFrameType) { fTypeChar = 'i'; } - snprintf (infoData, 50, ARDRONE_VIDEO_INFO_PATTERN, video->currentFrameSize, fTypeChar); + snprintf (infoData, ENCAPSULER_INFODATA_MAX_SIZE, ARDRONE_VIDEO_INFO_PATTERN, video->currentFrameSize, fTypeChar); uint32_t infoLen = strlen (infoData); if (infoLen != fwrite (infoData, 1, infoLen, video->infoFile)) { @@ -788,6 +818,7 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) if (0 == myVideo->width) { // Video was not initialized + ENCAPSULER_ERROR ("video was not initialized"); localError = ARDRONE_VIDEO_BAD_ARGS; } // No else } @@ -799,14 +830,14 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) { if (FRAME_TYPE_UNKNNOWN != myVideo->lastFrameType) { - char infoData [50] = {0}; + char infoData [ENCAPSULER_INFODATA_MAX_SIZE] = {0}; char fTypeChar = 'p'; if (FRAME_TYPE_I_FRAME == myVideo->lastFrameType || FRAME_TYPE_IDR_FRAME == myVideo->lastFrameType) { fTypeChar = 'i'; } - snprintf (infoData, 50, ARDRONE_VIDEO_INFO_PATTERN, myVideo->currentFrameSize, fTypeChar); + snprintf (infoData, ENCAPSULER_INFODATA_MAX_SIZE, ARDRONE_VIDEO_INFO_PATTERN, myVideo->currentFrameSize, fTypeChar); uint32_t infoLen = strlen (infoData); if (infoLen != fwrite (infoData, 1, infoLen, myVideo->infoFile)) @@ -847,10 +878,15 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) { ENCAPSULER_ERROR ("Unable to allocate buffers for video finish"); vp_os_free (frameSizeBuffer); + frameSizeBuffer = NULL; vp_os_free (frameSizeBufferNE); + frameSizeBufferNE = NULL; vp_os_free (frameOffsetBuffer); + frameOffsetBuffer = NULL; vp_os_free (iFrameIndexBuffer); + iFrameIndexBuffer = NULL; vp_os_free (frameIsIFrame); + frameIsIFrame = NULL; vp_os_mutex_unlock(&myVideo->mutex); localError = ARDRONE_VIDEO_GENERIC_ERROR; } @@ -877,7 +913,7 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) { fseek (myVideo->infoFile, descriptorSize, SEEK_CUR); } - while (! feof (myVideo->infoFile) && nbFrames <= myVideo->framesCount) + while (! feof (myVideo->infoFile) && nbFrames < myVideo->framesCount) { uint32_t fSize = -1; char fType = 'a'; @@ -901,12 +937,13 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) // create atoms // Generating Atoms tzset (); + struct tm *nowTm = localtime (&myVideo->creationTime); EMPTY_ATOM(moov); - movie_atom_t *mvhdAtom = mvhdAtomFromFpsNumFramesAndDate (myVideo->fps, nbFrames, myVideo->creationTime - timezone); + movie_atom_t *mvhdAtom = mvhdAtomFromFpsNumFramesAndDate (myVideo->fps, nbFrames, myVideo->creationTime - timezone + (3600 * nowTm->tm_isdst)); EMPTY_ATOM(trak); - movie_atom_t *tkhdAtom = tkhdAtomWithResolutionNumFramesFpsAndDate (myVideo->width, myVideo->height, nbFrames, myVideo->fps, myVideo->creationTime - timezone); + movie_atom_t *tkhdAtom = tkhdAtomWithResolutionNumFramesFpsAndDate (myVideo->width, myVideo->height, nbFrames, myVideo->fps, myVideo->creationTime - timezone + (3600 * nowTm->tm_isdst)); EMPTY_ATOM(mdia); - movie_atom_t *mdhdAtom = mdhdAtomFromFpsNumFramesAndDate (myVideo->fps, nbFrames, myVideo->creationTime - timezone); + movie_atom_t *mdhdAtom = mdhdAtomFromFpsNumFramesAndDate (myVideo->fps, nbFrames, myVideo->creationTime - timezone + (3600 * nowTm->tm_isdst)); movie_atom_t *hdlrAtom = hdlrAtomForMdia (); EMPTY_ATOM(minf); movie_atom_t *vmhdAtom = vmhdAtomGen (); @@ -925,6 +962,7 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) memcpy (&stssBuffer[8], iFrameIndexBuffer, nbIFrames * sizeof (uint32_t)); movie_atom_t *stssAtom = atomFromData (stssDataLen, "stss", stssBuffer); vp_os_free (stssBuffer); + stssBuffer = NULL; movie_atom_t *stscAtom = stscAtomGen (); @@ -936,6 +974,7 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) memcpy (&stszBuffer[12], frameSizeBufferNE, nbFrames * sizeof (uint32_t)); movie_atom_t *stszAtom = atomFromData (stszDataLen, "stsz", stszBuffer); vp_os_free (stszBuffer); + stszBuffer = NULL; // Generate stco atom from frameOffsetBuffer and nbFrames uint32_t stcoDataLen = (8 + (nbFrames * sizeof (uint32_t))); @@ -944,12 +983,12 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) memcpy (&stcoBuffer[8], frameOffsetBuffer, nbFrames * sizeof (uint32_t)); movie_atom_t *stcoAtom = atomFromData (stcoDataLen, "stco", stcoBuffer); vp_os_free (stcoBuffer); + stcoBuffer = NULL; EMPTY_ATOM (udta); movie_atom_t *swrAtom = metadataAtomFromTagAndValue ("swr", "AR.Drone 2.0"); char dateInfoString[ENCAPSULER_SMALL_STRING_SIZE] = {0}; - struct tm *nowTm = localtime (&myVideo->creationTime); snprintf (dateInfoString, ENCAPSULER_SMALL_STRING_SIZE, "%04d-%02d-%02dT%02d:%02d:%02d%+03d%02d", nowTm->tm_year + 1900, nowTm->tm_mon + 1, @@ -957,7 +996,7 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) nowTm->tm_hour, nowTm->tm_min, nowTm->tm_sec, - (int)(-timezone / 3600), + (int)(-timezone / 3600) + nowTm->tm_isdst, (int)((-timezone % 3600) / 60)); movie_atom_t *dayAtom = metadataAtomFromTagAndValue ("day", dateInfoString); @@ -965,10 +1004,17 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) int gpsIsValid = generateGpsString (gpsInfoString, ENCAPSULER_SMALL_STRING_SIZE); ENCAPSULER_DEBUG ("Valid : %d, Gps info string : %s\n", gpsIsValid, gpsInfoString); movie_atom_t *xyzAtom = NULL; + + /** + * Android 4.0.3 and later don't support the (c)xyz atom in the videos + * We won't generate it for any android versions + */ +#ifndef USE_ANDROID if (1 == gpsIsValid) { xyzAtom = metadataAtomFromTagAndValue ("xyz", gpsInfoString); } +#endif // Create atom tree insertAtomIntoAtom (udtaAtom, &swrAtom); @@ -1043,6 +1089,7 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) localError = ARDRONE_VIDEO_FILE_ERROR; } vp_os_free (mediaPath); + mediaPath = NULL; } else { @@ -1084,21 +1131,32 @@ ardrone_video_error_t ardrone_video_finish (ardrone_video_t **video) vp_os_mutex_unlock(&myVideo->mutex); vp_os_free (myVideo); + myVideo = NULL; *video = NULL; vp_os_free (frameSizeBuffer); + frameSizeBuffer = NULL; vp_os_free (frameSizeBufferNE); + frameSizeBufferNE = NULL; vp_os_free (frameOffsetBuffer); + frameOffsetBuffer = NULL; vp_os_free (iFrameIndexBuffer); + iFrameIndexBuffer = NULL; vp_os_free (frameIsIFrame); + frameIsIFrame = NULL; } else { vp_os_free (frameSizeBuffer); + frameSizeBuffer = NULL; vp_os_free (frameSizeBufferNE); + frameSizeBufferNE = NULL; vp_os_free (frameOffsetBuffer); + frameOffsetBuffer = NULL; vp_os_free (iFrameIndexBuffer); + iFrameIndexBuffer = NULL; vp_os_free (frameIsIFrame); + frameIsIFrame = NULL; vp_os_mutex_unlock(&myVideo->mutex); ardrone_video_cleanup (video); } @@ -1494,10 +1552,13 @@ bool_t ardrone_video_try_fix (const char *infoFilePath) { ENCAPSULER_DEBUG ("Freeing local copies"); ENCAPSULER_CLEANUP (vp_os_free, video->sps); + video->sps = NULL; ENCAPSULER_CLEANUP (vp_os_free, video->pps); + video->pps = NULL; ENCAPSULER_CLEANUP (fclose, video->infoFile); ENCAPSULER_CLEANUP (fclose, video->outFile); ENCAPSULER_CLEANUP (vp_os_free ,video); + video = NULL; } if (NULL != infoFile) diff --git a/ARDroneLib/Soft/Lib/utils/ardrone_video_encapsuler.h b/ARDroneLib/Soft/Lib/utils/ardrone_video_encapsuler.h index 4f69b46..9878715 100644 --- a/ARDroneLib/Soft/Lib/utils/ardrone_video_encapsuler.h +++ b/ARDroneLib/Soft/Lib/utils/ardrone_video_encapsuler.h @@ -30,12 +30,12 @@ #define ARDRONE_VIDEO_NUM_MATCH_PATTERN (2) typedef enum { - ARDRONE_VIDEO_NO_ERROR = 0, - ARDRONE_VIDEO_GENERIC_ERROR, - ARDRONE_VIDEO_BAD_CODEC, - ARDRONE_VIDEO_FILE_ERROR, - ARDRONE_VIDEO_WAITING_FOR_IFRAME, - ARDRONE_VIDEO_BAD_ARGS, + ARDRONE_VIDEO_NO_ERROR = 0, + ARDRONE_VIDEO_GENERIC_ERROR, + ARDRONE_VIDEO_BAD_CODEC, + ARDRONE_VIDEO_FILE_ERROR, + ARDRONE_VIDEO_WAITING_FOR_IFRAME, + ARDRONE_VIDEO_BAD_ARGS, } ardrone_video_error_t; #if COUNT_WAITING_FOR_IFRAME_AS_AN_ERROR @@ -44,62 +44,62 @@ typedef enum { #else static inline int ARDRONE_VIDEO_FAILED (ardrone_video_error_t error) { - if (ARDRONE_VIDEO_NO_ERROR == error || - ARDRONE_VIDEO_WAITING_FOR_IFRAME == error) + if (ARDRONE_VIDEO_NO_ERROR == error || + ARDRONE_VIDEO_WAITING_FOR_IFRAME == error) { - return 0; + return 0; } - return 1; + return 1; } static inline int ARDRONE_VIDEO_SUCCEEDED (ardrone_video_error_t error) { - if (ARDRONE_VIDEO_NO_ERROR == error || - ARDRONE_VIDEO_WAITING_FOR_IFRAME == error) + if (ARDRONE_VIDEO_NO_ERROR == error || + ARDRONE_VIDEO_WAITING_FOR_IFRAME == error) { - return 1; + return 1; } - return 0; + return 0; } #endif // COUNT_WAITING_FOR_IFRAME_AS_AN_ERROR typedef enum { - ARDRONE_VIDEO_MOV = 0, - ARDRONE_VIDEO_QUICKTIME = ARDRONE_VIDEO_MOV, // Alias for mov file - ARDRONE_VIDEO_MP4, + ARDRONE_VIDEO_MOV = 0, + ARDRONE_VIDEO_QUICKTIME = ARDRONE_VIDEO_MOV, // Alias for mov file + ARDRONE_VIDEO_MP4, } ardrone_video_type_t; typedef struct _ardrone_video_t { uint32_t version; - // Provided to constructor - uint32_t fps; - ardrone_video_type_t videoType; - // Read from frames PaVE - parrot_video_encapsulation_codecs_t videoCodec; - uint16_t width; - uint16_t height; - // Private datas - char infoFilePath [ARDRONE_VIDEO_PATH_MAX_SIZE]; // Keep this so we can delete the file - char outFilePath [ARDRONE_VIDEO_PATH_MAX_SIZE]; // Keep this so we can rename the output file - char tempFilePath [ARDRONE_VIDEO_PATH_MAX_SIZE]; // Keep this so we can rename the output file - FILE *infoFile; - FILE *outFile; - uint32_t framesCount; // Number of frames - uint32_t mdatAtomOffset; - uint32_t framesDataOffset; + // Provided to constructor + uint32_t fps; + ardrone_video_type_t videoType; + // Read from frames PaVE + parrot_video_encapsulation_codecs_t videoCodec; + uint16_t width; + uint16_t height; + // Private datas + char infoFilePath [ARDRONE_VIDEO_PATH_MAX_SIZE]; // Keep this so we can delete the file + char outFilePath [ARDRONE_VIDEO_PATH_MAX_SIZE]; // Keep this so we can rename the output file + char tempFilePath [ARDRONE_VIDEO_PATH_MAX_SIZE]; // Keep this so we can rename the output file + FILE *infoFile; + FILE *outFile; + uint32_t framesCount; // Number of frames + uint32_t mdatAtomOffset; + uint32_t framesDataOffset; - /* H.264 only values */ - uint8_t *sps; + /* H.264 only values */ + uint8_t *sps; uint8_t *pps; - uint16_t spsSize; - uint16_t ppsSize; + uint16_t spsSize; + uint16_t ppsSize; - /* Slices recording values */ - uint32_t lastFrameNumber; - parrot_video_encapsulation_frametypes_t lastFrameType; - uint32_t currentFrameSize; - - vp_os_mutex_t mutex; + /* Slices recording values */ + uint32_t lastFrameNumber; + parrot_video_encapsulation_frametypes_t lastFrameType; + uint32_t currentFrameSize; + + vp_os_mutex_t mutex; time_t creationTime; uint32_t droneVersion; } ardrone_video_t; @@ -187,6 +187,7 @@ void ardrone_video_set_gps_infos (double latitude, double longitude, double alti /** * Try fo fix an MP4 infovid file. * @param infoFilePath Full path to the .infovid file. + * @return TRUE on success, FALSE on failure */ bool_t ardrone_video_try_fix (const char *infoFilePath); diff --git a/ARDroneLib/VLIB/P263/p263_codec.c b/ARDroneLib/VLIB/P263/p263_codec.c index 935a56c..9a7f701 100644 --- a/ARDroneLib/VLIB/P263/p263_codec.c +++ b/ARDroneLib/VLIB/P263/p263_codec.c @@ -57,6 +57,8 @@ void p263_codec_free( video_controller_t* controller ) p263_codec_t* p263_codec = (p263_codec_t*) controller->video_codec; vp_os_free( p263_codec ); + controller->video_codec = NULL; + } static INLINE video_macroblock_t* p263_unquantize_idct( video_controller_t* controller, video_macroblock_t* mb, int32_t num_macro_blocks ) diff --git a/ARDroneLib/VLIB/P264/p264_codec.c b/ARDroneLib/VLIB/P264/p264_codec.c index f9b7c0e..c823222 100644 --- a/ARDroneLib/VLIB/P264/p264_codec.c +++ b/ARDroneLib/VLIB/P264/p264_codec.c @@ -94,9 +94,16 @@ void p264_codec_free( video_controller_t* controller ) if( p264_codec != NULL ) { if (p264_codec->ref_picture.y_buf != NULL) + { vp_os_free(p264_codec->ref_picture.y_buf); + p264_codec->ref_picture.y_buf = NULL; + } if (p264_codec->decoded_picture.y_buf != NULL) + { vp_os_free(p264_codec->decoded_picture.y_buf); + p264_codec->decoded_picture.y_buf = NULL; + } + vp_os_free( p264_codec ); controller->video_codec = NULL; } @@ -300,17 +307,17 @@ C_RESULT p264_unpack_controller( video_controller_t* controller ) // new picture p264_read_picture_layer( controller, stream ); - if (((controller->num_frames == (last_frame_decoded + 1)) && (controller->last_frame_decoded == TRUE)) - || (controller->picture_type == VIDEO_PICTURE_INTRA)) - { - // new picture is decodable because it's an I frame or previous frame was decodable - controller->last_frame_decoded = TRUE; + if (((controller->num_frames == (last_frame_decoded + 1)) && (controller->last_frame_decoded == TRUE)) + || (controller->picture_type == VIDEO_PICTURE_INTRA)) + { + // new picture is decodable because it's an I frame or previous frame was decodable + controller->last_frame_decoded = TRUE; + } + else + { + controller->last_frame_decoded = FALSE; } - else - { - controller->last_frame_decoded = FALSE; - } - + p264_realloc_ref(controller); picture_layer->gobs = (p264_gob_layer_t*) controller->gobs; gob = &picture_layer->gobs[controller->blockline]; diff --git a/ARDroneLib/VLIB/Platform/arm9/UVLC/uvlc_mb_layer_p5p.S b/ARDroneLib/VLIB/Platform/arm9/UVLC/uvlc_mb_layer_p5p.S index b4cfcd8..a2771a0 100644 --- a/ARDroneLib/VLIB/Platform/arm9/UVLC/uvlc_mb_layer_p5p.S +++ b/ARDroneLib/VLIB/Platform/arm9/UVLC/uvlc_mb_layer_p5p.S @@ -2,13 +2,6 @@ #ifdef HAS_UVLC_WRITE_BLOCK -#ifdef _ECOS -#include "config-tcm.h" - - .section ".text.itcm","ax" -#endif // ! _ECOS - - .global uvlc_write_block .type uvlc_write_block, %function diff --git a/ARDroneLib/VLIB/Platform/arm9/video_quantizer_p5p.S b/ARDroneLib/VLIB/Platform/arm9/video_quantizer_p5p.S index 3aa0da6..e4c4b18 100644 --- a/ARDroneLib/VLIB/Platform/arm9/video_quantizer_p5p.S +++ b/ARDroneLib/VLIB/Platform/arm9/video_quantizer_p5p.S @@ -2,12 +2,6 @@ #ifdef HAS_DO_QUANTIZE_INTRA_MB -#ifdef _ECOS -#include "config-tcm.h" - - .section ".text.itcm","ax" -#endif // ! _ECOS - .global do_quantize_intra_mb .type do_quantize_intra_mb, %function diff --git a/ARDroneLib/VLIB/UVLC/uvlc_codec.c b/ARDroneLib/VLIB/UVLC/uvlc_codec.c index ab1fc8d..2fd33dc 100644 --- a/ARDroneLib/VLIB/UVLC/uvlc_codec.c +++ b/ARDroneLib/VLIB/UVLC/uvlc_codec.c @@ -235,7 +235,7 @@ C_RESULT uvlc_unpack_controller( video_controller_t* controller ) { // new picture uvlc_read_picture_layer( controller, stream ); - controller->last_frame_decoded = TRUE; + controller->last_frame_decoded = TRUE; picture_layer->gobs = (uvlc_gob_layer_t*) controller->gobs; gob = &picture_layer->gobs[controller->blockline]; diff --git a/ARDroneLib/VLIB/video_codec.c b/ARDroneLib/VLIB/video_codec.c index 92f4558..c34b05b 100644 --- a/ARDroneLib/VLIB/video_codec.c +++ b/ARDroneLib/VLIB/video_codec.c @@ -257,8 +257,8 @@ C_RESULT video_decode_blockline( video_controller_t* controller, vp_api_picture_ if (C_OK == isCodecOK && NULL != controller->video_codec) { - return controller->video_codec->decode_blockline( controller, blockline, got_image ); - } + return controller->video_codec->decode_blockline( controller, blockline, got_image ); +} else { return C_FAIL; diff --git a/ARDroneLib/VLIB/video_controller.c b/ARDroneLib/VLIB/video_controller.c index 94d2c55..b4c134f 100644 --- a/ARDroneLib/VLIB/video_controller.c +++ b/ARDroneLib/VLIB/video_controller.c @@ -123,6 +123,7 @@ C_RESULT video_controller_cleanup( video_controller_t* controller ) { gob = &controller->gobs[0]; vp_os_free(gob->macroblocks); + gob->macroblocks = NULL; vp_os_free( controller->gobs ); controller->gobs = NULL; } diff --git a/ARDroneLib/VLIB/video_huffman.c b/ARDroneLib/VLIB/video_huffman.c index 6f5dd9f..cc5147c 100644 --- a/ARDroneLib/VLIB/video_huffman.c +++ b/ARDroneLib/VLIB/video_huffman.c @@ -19,6 +19,7 @@ huffman_tree_t* huffman_alloc( int32_t num_max_codes, int32_t max_code_length ) void huffman_free( huffman_tree_t* tree ) { vp_os_free( tree ); + tree = NULL; } C_RESULT huffman_add_codes( huffman_tree_t* tree, huffman_code_t* codes, int32_t num_codes ) diff --git a/ARDroneLib/VP_SDK/ATcodec/ATcodec_api.c b/ARDroneLib/VP_SDK/ATcodec/ATcodec_api.c index e712f65..273a164 100644 --- a/ARDroneLib/VP_SDK/ATcodec/ATcodec_api.c +++ b/ARDroneLib/VP_SDK/ATcodec/ATcodec_api.c @@ -295,7 +295,7 @@ ATcodec_Add_Defined_Message_Tree (ATcodec_Tree_t *tree, const char *str) void ATcodec_Init_Library (AT_CODEC_FUNCTIONS_PTRS *funcs) { - ATcodec_Init_Library_Tree (&default_tree, funcs); + ATcodec_Init_Library_Tree (&default_tree, funcs); } void @@ -341,7 +341,7 @@ ATcodec_Init_Library_Tree (ATcodec_Tree_t *tree, AT_CODEC_FUNCTIONS_PTRS *func void ATcodec_Shutdown_Library (void) { - ATcodec_Shutdown_Library_Tree(&default_tree); + ATcodec_Shutdown_Library_Tree(&default_tree); } @@ -699,15 +699,15 @@ ATcodec_Send_Messages() if(!atcodec_lib_init_ok) return ATCODEC_FALSE; - + vp_os_mutex_lock(&ATcodec_cond_mutex); if(ATcodec_Message_len > INTERNAL_BUFFER_SIZE) - printf("ATcodec_Send_Messages : buf=%s, len=%d\n", &ATcodec_Message_Buffer[0], ATcodec_Message_len); - + PRINT("ATcodec_Send_Messages : buf=%s, len=%d\n", &ATcodec_Message_Buffer[0], ATcodec_Message_len); + if(ATcodec_Message_len && func_ptrs.write((uint8_t*)&ATcodec_Message_Buffer[0], (int32_t*)&ATcodec_Message_len) != AT_CODEC_WRITE_OK) - res = ATCODEC_FALSE; - - ATcodec_Message_len = 0; + res = ATCODEC_FALSE; + + ATcodec_Message_len = 0; vp_os_mutex_unlock(&ATcodec_cond_mutex); diff --git a/ARDroneLib/VP_SDK/Build/Makefile b/ARDroneLib/VP_SDK/Build/Makefile index 48bc4a3..bda3259 100644 --- a/ARDroneLib/VP_SDK/Build/Makefile +++ b/ARDroneLib/VP_SDK/Build/Makefile @@ -83,7 +83,7 @@ before_check: #------------------------------------------------------------------------------------------------------------------------ -TARGETS=vlib parrotOS_core parrotOS_utils parrotOS_drivers parrotOS_devs parrotOS_codec libplf sdk lib app +TARGETS=vlib libplf sdk lib app # When building on Ubuntu, only the final application (USE_APP) depends on the above-mentioned libraries. # The iPhone applications do not use USE_APP; the above-mentioned libraries must therefore be built @@ -105,9 +105,6 @@ define ADD_RULE_TEMPLATE ifeq ($(USE_ANDROID),yes) build_lib: build_$(1) endif - ifeq ($(USE_LINUX), yes) - build_lib: build_$(1) - endif endif endif endif diff --git a/ARDroneLib/VP_SDK/Build/do.sh b/ARDroneLib/VP_SDK/Build/do.sh index 352db51..f49f180 100755 --- a/ARDroneLib/VP_SDK/Build/do.sh +++ b/ARDroneLib/VP_SDK/Build/do.sh @@ -19,47 +19,10 @@ USE_VLIB=yes SWING_VERSION=head # Check validity of script usage. -if [ $1 ] && [ $1 = ecos ] ; then - if [ ! $QUIET_BUILD = yes ] ; then - echo ; echo "BUILD FOR ECOS" ; echo - fi - USE_ECOS=yes - USE_LINUX=no - USE_ELINUX=no - USE_NDS=no - USE_IPHONE=no - # head ecos-stable-2006-11-21 ecos-stable-2007-07-23 CK5300_Version_20070928_Beta5 - ECOS_VERSION=Mykonos_Version_20090212 - PROJECT=mykonos_p5p - MODE_TARGET=rls_ram_wifi_ap - CUSTOM_PRIORITIES=$ALL_SOURCES/video/$SDK_VERSION/Video/VP_SDK/VP_Os/ecos/task_priorities.h - # gnutools_2008_03_28 gnutools_2007_02_07 gnutools_2005_05_20 - GNUTOOLS_VERSION=gnutools_2008_03_28 - USE_ECOS_RELEASE=no - NO_COM=no - USE_BONJOUR=no - USE_BLUES32=no - # Stable_20070307 Stable_20060922 Stable_20061129_Blues_3_6_4 Version_KEA_1_00_RC5_200701131 - BLUES32_VERSION=Stable_20060922 - COMMONSOFT_VERSION=head - USE_PVSP=yes - USE_SOUL=no - SOUL_VERSION=Stable_20070307 - USE_TANGO=no - # Stable_20061222 Stable_20070509 - TANGO_VERSION=Stable_20070509 - DONT_USE_TTS=yes - USE_CK5050=no - CK5050_VERSION=head - USE_BLUEZ=no - # P5 Intel smdk2412 - FF_ARCH=P5 - USE_PARROTOS_CORE=no -elif [ $1 ] && [ $1 = elinux ] ; then +if [ $1 ] && [ $1 = elinux ] ; then if [ ! $QUIET_BUILD = yes ] ; then echo ; echo "BUILD FOR EMBEDDED LINUX" ; echo fi - USE_ECOS=no USE_LINUX=no USE_ELINUX=yes USE_NDS=no @@ -80,7 +43,6 @@ elif [ $1 ] && [ $1 = linux ] ; then if [ ! $QUIET_BUILD = yes ] ; then echo ; echo "BUILD FOR LINUX" ; echo fi - USE_ECOS=no USE_LINUX=yes USE_ELINUX=no USE_NDS=no @@ -96,7 +58,6 @@ elif [ $1 ] && [ $1 = nds ] ; then if [ ! $QUIET_BUILD = yes ] ; then echo ; echo "BUILD FOR NINTENDO DS" ; echo fi - USE_ECOS=no USE_LINUX=no USE_ELINUX=no USE_NDS=yes @@ -112,7 +73,6 @@ elif [ $1 ] && [ ${1:0:6} = iphone ] ; then if [ ! $QUIET_BUILD = yes ] ; then echo ; echo "BUILD FOR IPHONE with platform $1 $IPHONE_SDK_VERSION" ; echo fi - USE_ECOS=no USE_LINUX=no USE_ELINUX=no USE_NDS=no @@ -135,7 +95,6 @@ FLAGS="USE_APP=$USE_APP" FLAGS="IPHONE_SDK_VERSION=$IPHONE_SDK_VERSION $FLAGS" FLAGS="NO_EXAMPLES=$NO_EXAMPLES $FLAGS" FLAGS="GNUTOOLS_VERSION=$GNUTOOLS_VERSION $FLAGS" -FLAGS="USE_ECOS=$USE_ECOS $FLAGS" FLAGS="USE_LINUX=$USE_LINUX $FLAGS" FLAGS="USE_ELINUX=$USE_ELINUX $FLAGS" FLAGS="USE_NDS=$USE_NDS $FLAGS" @@ -160,8 +119,6 @@ FLAGS="QUIET_BUILD=$QUIET_BUILD $FLAGS" FLAGS="RELEASE_BUILD=$RELEASE_BUILD $FLAGS" FLAGS="SDK_VERSION=$SDK_VERSION $FLAGS" -FLAGS="USE_ECOS_RELEASE=$USE_ECOS_RELEASE $FLAGS" -FLAGS="ECOS_VERSION=$ECOS_VERSION $FLAGS" FLAGS="ELINUX_VERSION=$ELINUX_VERSION $FLAGS" FLAGS="PROJECT=$PROJECT $FLAGS" FLAGS="MODE_TARGET=$MODE_TARGET $FLAGS" @@ -181,17 +138,10 @@ FLAGS="USE_IWLIB=$USE_IWLIB $FLAGS" FLAGS="USE_PARROTOS_CORE=$USE_PARROTOS_CORE $FLAGS" FLAGS="COMMONSOFT_VERSION=$COMMONSOFT_VERSION $FLAGS" -if [ $USE_ECOS = yes ] ; then - FLAGS="CUSTOM_PRIORITIES=$CUSTOM_PRIORITIES $FLAGS" -fi - if [ $USE_ELINUX = yes ] ; then FLAGS="CONFIG_PARROTOS=$CONFIG_PARROTOS $FLAGS" fi -if [ $USE_ECOS = yes ] && [ $2 ] && ! [ $2 = check ] && ! [ $2 = clean ] || [ $USE_ECOS = yes ] && ! [ $2 ] ; then - CHOOSE=yes -fi if [ $2 ] && [ $2 = check ] ; then CHECK=yes fi @@ -212,38 +162,3 @@ if [ $CHECK ] && [ $CHECK = yes ] ; then else make -f Makefile $FLAGS $* 2>&1 fi - -##################### -# Choose example ? -##################### - -if [ $CHOOSE ] && [ $CHOOSE = yes ] ; then - j=1 ; for i in $( find . -type d -name "*Examples" | grep arm ) ; do j=$( expr $j + 1 ) ; done - - if [ $j = 1 ] ; then - echo No example directory found - exit - fi - - if ! [ $j = 2 ] ; then - j=1 ; for i in $( find . -type d -name "*Examples" | grep arm ) ; do echo -e "\t$j\t$i" ; j=$( expr $j + 1 ) ; done - echo -n -e "\nChoose directory : " - read var - j=1 ; for i in $( find . -type d -name "*Examples" | grep arm ) ; do if [ $j = $var ] ; then ex_dir=$i ; fi ; j=$( expr $j + 1 ) ; done - else - ex_dir=$( find . -type d -name "*Examples" | grep arm ) - fi - - echo -e "\nDirectory $ex_dir :" - - j=1 ; for i in $( find $ex_dir -type f -exec basename \{\} \; ) ; do echo -e "\t$j\t$i" ; j=$( expr $j + 1 ) ; done - echo -n -e "\nChoose example : " - read var - j=1 ; for i in $( find $ex_dir -type f ) ; do if [ $j = $var ] ; then ex_file=$i ; fi ; j=$( expr $j + 1 ) ; done - - if [ ! -z $ex_file ] && [ -f $ex_file ] ; then - cp $ex_file /srv/tftp/program.elf && echo -e "\n$ex_file copied to /srv/tftp/program.elf" - else - echo -e "\nBad choice !" - fi -fi diff --git a/ARDroneLib/VP_SDK/VP_Os/elinux/vp_os_signal.c b/ARDroneLib/VP_SDK/VP_Os/elinux/vp_os_signal.c index 00381fb..e980d98 100644 --- a/ARDroneLib/VP_SDK/VP_Os/elinux/vp_os_signal.c +++ b/ARDroneLib/VP_SDK/VP_Os/elinux/vp_os_signal.c @@ -66,7 +66,6 @@ vp_os_cond_wait(vp_os_cond_t *cond) pthread_cond_wait(&cond->cond, (pthread_mutex_t *)cond->mutex); } - C_RESULT vp_os_cond_timed_wait(vp_os_cond_t *cond, uint32_t ms) { diff --git a/ARDroneLib/VP_SDK/VP_Os/linux/vp_os_signal.c b/ARDroneLib/VP_SDK/VP_Os/linux/vp_os_signal.c index 810614d..34de98c 100644 --- a/ARDroneLib/VP_SDK/VP_Os/linux/vp_os_signal.c +++ b/ARDroneLib/VP_SDK/VP_Os/linux/vp_os_signal.c @@ -86,11 +86,13 @@ vp_os_cond_timed_wait(vp_os_cond_t *cond, uint32_t ms) gettimeofday(&tv, NULL); TIMEVAL_TO_TIMESPEC(&tv, &ts); ts.tv_sec += ms/1000; - ts.tv_nsec += (ms%1000)*1000; + ts.tv_nsec += (ms%1000)*1000000; + if (ts.tv_nsec>1000000000) { ts.tv_sec++, ts.tv_nsec-=1000000000; } return ( pthread_cond_timedwait(&cond->cond, (pthread_mutex_t *)cond->mutex, &ts) == ETIMEDOUT ? FAIL : SUCCESS ); } + void vp_os_cond_signal(vp_os_cond_t *cond) { diff --git a/ARDroneLib/VP_SDK/VP_Os/vp_os_print.h b/ARDroneLib/VP_SDK/VP_Os/vp_os_print.h index 8197065..207e5b9 100644 --- a/ARDroneLib/VP_SDK/VP_Os/vp_os_print.h +++ b/ARDroneLib/VP_SDK/VP_Os/vp_os_print.h @@ -23,20 +23,28 @@ #endif // __MACOSX__ #ifdef USE_ANDROID -#include -#undef PRINT -#define PRINT(_fmt_, args...) \ + #include + #undef PRINT + #ifdef DEBUG_MODE + #define PRINT(_fmt_, args...) \ __android_log_print(ANDROID_LOG_INFO, "ARDrone", _fmt_, ##args) + #else + #define PRINT(...) + #endif //DEBUG_MODE +#endif // USE_ANDROID + +#ifndef PRINT + #define PRINT printf #endif #ifdef DEBUG_MODE - #define DEBUG_PRINT_SDK(...) printf(__VA_ARGS__) + #define DEBUG_PRINT_SDK(...) PRINT(__VA_ARGS__) #else #define DEBUG_PRINT_SDK(...) #endif #ifdef DEBUG_MODE - #define DEBUG_PRINT(...) printf(__VA_ARGS__) + #define DEBUG_PRINT(...) PRINT(__VA_ARGS__) #else #define DEBUG_PRINT(...) #endif diff --git a/ARDroneLib/VP_SDK/VP_Stages/vp_stages_frame_pipe.c b/ARDroneLib/VP_SDK/VP_Stages/vp_stages_frame_pipe.c index 7b6f7a8..9716d4f 100644 --- a/ARDroneLib/VP_SDK/VP_Stages/vp_stages_frame_pipe.c +++ b/ARDroneLib/VP_SDK/VP_Stages/vp_stages_frame_pipe.c @@ -2,9 +2,6 @@ #include #include -#ifdef USE_ELINUX -#include -#endif // Sender function C_RESULT vp_stages_frame_pipe_sender_open(vp_stages_frame_pipe_config_t *cfg) @@ -185,6 +182,7 @@ C_RESULT vp_stages_frame_pipe_receiver_close(vp_stages_frame_pipe_config_t *cfg) { vp_os_free (cfg->outPicture.raw); + cfg->outPicture.raw = NULL; vp_os_cond_destroy (&(cfg->buffer_sent)); vp_os_mutex_destroy (&(cfg->pipe_mut)); return C_OK; diff --git a/ARDroneLib/VP_SDK/VP_Stages/vp_stages_io_buffer.c b/ARDroneLib/VP_SDK/VP_Stages/vp_stages_io_buffer.c index d34c2a7..54a4c81 100644 --- a/ARDroneLib/VP_SDK/VP_Stages/vp_stages_io_buffer.c +++ b/ARDroneLib/VP_SDK/VP_Stages/vp_stages_io_buffer.c @@ -99,7 +99,10 @@ vp_stages_output_buffer_stage_transform(vp_stages_output_buffer_config_t *cfg, v } if(in->status == VP_API_STATUS_ENDED) - vp_os_free(out->buffers); + { + vp_os_free(out->buffers); + out->buffers = NULL; + } out->status = in->status; diff --git a/ARDroneLib/VP_SDK/VP_Stages/vp_stages_io_file.c b/ARDroneLib/VP_SDK/VP_Stages/vp_stages_io_file.c index 4ea92b7..a460508 100644 --- a/ARDroneLib/VP_SDK/VP_Stages/vp_stages_io_file.c +++ b/ARDroneLib/VP_SDK/VP_Stages/vp_stages_io_file.c @@ -96,7 +96,7 @@ vp_stages_input_file_stage_open(vp_stages_input_file_config_t *cfg) cfg->buffers = vp_os_malloc(sizeof(*cfg->buffers)*cfg->nb_buffers); if (cfg->buffers==NULL) { - printf("%s:%d - Failed preloading %s : not enough memory for buffer pointers(required %d pointers)\n", + PRINT("%s:%d - Failed preloading %s : not enough memory for buffer pointers(required %d pointers)\n", __FUNCTION__,__LINE__, cfg->name,cfg->nb_buffers/(1024*1024)); } @@ -113,7 +113,7 @@ vp_stages_input_file_stage_open(vp_stages_input_file_config_t *cfg) #endif if (cfg->data==NULL) { - printf("Failed preloading %s : not enough memory (required %d MB)\n", + PRINT("Failed preloading %s : not enough memory (required %d MB)\n", cfg->name,cfg->buffer_size*cfg->nb_buffers/(1024*1024)); } @@ -124,10 +124,12 @@ vp_stages_input_file_stage_open(vp_stages_input_file_config_t *cfg) if (cfg->data && cfg->preload!=0) { - printf("Preloading file %s to memory ...\n",cfg->name); + PRINT("Preloading file %s to memory ...\n",cfg->name); for (i=0;inb_buffers;i++) { - printf("."); fflush(stdout); +#ifndef USE_ELINUX + PRINT("."); fflush(stdout); +#endif res = fread(cfg->buffers[i], cfg->buffer_size , 1 , cfg->f); if (res<1) { @@ -135,14 +137,14 @@ vp_stages_input_file_stage_open(vp_stages_input_file_config_t *cfg) cfg->nb_buffers=i; /* Store the number of successfully read frames */ } } - printf("ok.\n"); + PRINT("ok.\n"); fclose(cfg->f); cfg->f=NULL; } cfg->current_buffer=0; - printf("Using %s input file %s\n resolution %dx%d\n total size : %d MB\n", + PRINT("Using %s input file %s\n resolution %dx%d\n total size : %d MB\n", (PIX_FMT_YUV420P==cfg->vp_api_picture.format)?"420P":"422", cfg->name, cfg->width,cfg->height,filesize/(1024*1024)); @@ -156,7 +158,7 @@ vp_stages_input_file_stage_transform(vp_stages_input_file_config_t *cfg, vp_api_ vp_os_mutex_lock(&out->lock); #ifdef VERBOSE - printf("%s:%d Reading a frame from YUV file %s ...\n",__FUNCTION__,__LINE__,cfg->name); + PRINT("%s:%d Reading a frame from YUV file %s ...\n",__FUNCTION__,__LINE__,cfg->name); #endif /* Init */ @@ -170,7 +172,7 @@ vp_stages_input_file_stage_transform(vp_stages_input_file_config_t *cfg, vp_api_ #ifdef VERBOSE - printf("%s:%d Frames stored at address %p.\n",__FUNCTION__,__LINE__,cfg->data); + PRINT("%s:%d Frames stored at address %p.\n",__FUNCTION__,__LINE__,cfg->data); #endif } @@ -197,7 +199,7 @@ vp_stages_input_file_stage_transform(vp_stages_input_file_config_t *cfg, vp_api_ /* Read a frame from the disk file */ #ifdef VERBOSE - printf("%s:%d Requesting %d bytes ...\n",__FUNCTION__,__LINE__,cfg->buffer_size); + PRINT("%s:%d Requesting %d bytes ...\n",__FUNCTION__,__LINE__,cfg->buffer_size); #endif out->buffers=cfg->buffers; @@ -205,7 +207,7 @@ vp_stages_input_file_stage_transform(vp_stages_input_file_config_t *cfg, vp_api_ out->size = fread(out->buffers[0], cfg->buffer_size, 1 , cfg->f); #ifdef VERBOSE - printf("%s:%d Read %d bytes ...\n",__FUNCTION__,__LINE__,out->size); + PRINT("%s:%d Read %d bytes ...\n",__FUNCTION__,__LINE__,out->size); #endif /* Go back at the beginning of the file if we reached the end of the video */ @@ -282,7 +284,7 @@ vp_stages_output_file_stage_open(vp_stages_output_file_config_t *cfg) cfg->f = fopen(cfg->name, "wb"); if(NULL == cfg->f) { - printf("%s:%d - Error opening file %s\n",__FUNCTION__,__LINE__,cfg->name);perror(""); + PRINT("%s:%d - Error opening file %s\n",__FUNCTION__,__LINE__,cfg->name);perror(""); return VP_FAILURE; } return (VP_SUCCESS); diff --git a/ARDroneLib/VP_SDK/VP_Stages/vp_stages_o_sdl.c b/ARDroneLib/VP_SDK/VP_Stages/vp_stages_o_sdl.c index a024cde..9f71dcf 100644 --- a/ARDroneLib/VP_SDK/VP_Stages/vp_stages_o_sdl.c +++ b/ARDroneLib/VP_SDK/VP_Stages/vp_stages_o_sdl.c @@ -355,10 +355,11 @@ vp_stages_output_sdl_stage_transform(vp_stages_output_sdl_config_t *cfg, vp_api_ // not managed if(in->status == VP_API_STATUS_ENDED) - { + { pipeline_opened = 0; vp_os_free(out->buffers); - } + out->buffers = NULL; + } vp_os_mutex_unlock(&out->lock);