Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
|
e9a5df4b5a | 4 months ago |
|
28a09335f5 | 4 months ago |
@ -1,227 +0,0 @@
|
|||||||
#!/system/bin/sh
|
|
||||||
|
|
||||||
# ==============================================
|
|
||||||
# Configuration parameters - modify as needed
|
|
||||||
# ==============================================
|
|
||||||
ETH_IP="192.168.68.91" # Ethernet IP address
|
|
||||||
ETH_NETMASK="24" # Subnet mask (CIDR format)
|
|
||||||
ETH_NETWORK="192.168.68.0" # Network address
|
|
||||||
ETH_BROADCAST="192.168.68.255" # Broadcast address
|
|
||||||
ETH_GATEWAY="192.168.68.1" # Default gateway
|
|
||||||
ROUTE_TABLE="20" # Routing table number
|
|
||||||
MAX_INIT_WAIT=150 # Maximum seconds to wait for ethernet interface
|
|
||||||
MAX_UP_WAIT=10 # Maximum seconds to wait for interface to come UP
|
|
||||||
MAX_ROUTE_WAIT=5 # Maximum seconds to wait for routing rules
|
|
||||||
|
|
||||||
# For debugging only - comment out in production
|
|
||||||
# set -x
|
|
||||||
|
|
||||||
ANDROID_VERSION=$(getprop ro.build.version.release 2>/dev/null | cut -d '.' -f1)
|
|
||||||
|
|
||||||
# Record script start time
|
|
||||||
SCRIPT_START=$(date +%s)
|
|
||||||
|
|
||||||
# Cleanup function - handles unexpected interruptions
|
|
||||||
cleanup() {
|
|
||||||
echo "Script interrupted, cleaning up..." >&2
|
|
||||||
# Add additional cleanup code here if needed
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
trap cleanup INT TERM
|
|
||||||
|
|
||||||
# Get script directory for finding tools like ethtool
|
|
||||||
SCRIPT_PATH="$0"
|
|
||||||
# Ensure path is absolute
|
|
||||||
case "$SCRIPT_PATH" in
|
|
||||||
/*) ;; # Already absolute path
|
|
||||||
*) SCRIPT_PATH="$PWD/$SCRIPT_PATH" ;;
|
|
||||||
esac
|
|
||||||
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
|
|
||||||
echo "Script directory detected as: $SCRIPT_DIR"
|
|
||||||
|
|
||||||
# Only configure rp_filter for eth0 interface
|
|
||||||
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter 2>/dev/null || true
|
|
||||||
|
|
||||||
# Wait for eth0 interface to appear
|
|
||||||
WAITED=0
|
|
||||||
while [ $WAITED -lt $MAX_INIT_WAIT ]; do
|
|
||||||
if [ -d "/sys/class/net/eth0" ]; then
|
|
||||||
echo "eth0 found after $WAITED seconds"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
echo "Wait eth0... ($WAITED/$MAX_INIT_WAIT)"
|
|
||||||
sleep 0.1
|
|
||||||
WAITED=$((WAITED+1))
|
|
||||||
done
|
|
||||||
|
|
||||||
# Check if eth0 exists
|
|
||||||
if ! [ -d "/sys/class/net/eth0" ]; then
|
|
||||||
echo "Error: eth0 not exists" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check physical connection status
|
|
||||||
if [ -f "/sys/class/net/eth0/carrier" ]; then
|
|
||||||
CARRIER=$(cat /sys/class/net/eth0/carrier)
|
|
||||||
echo "Physical connection status: $CARRIER (1=connected, 0=disconnected)"
|
|
||||||
if [ "$CARRIER" != "1" ]; then
|
|
||||||
echo "Warning: Ethernet physical connection may have issues, please check the cable" >&2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Clear previous configuration
|
|
||||||
/system/bin/ip link set eth0 down
|
|
||||||
/system/bin/ip addr flush dev eth0
|
|
||||||
/system/bin/ip route flush dev eth0
|
|
||||||
/system/bin/ip route flush table $ROUTE_TABLE
|
|
||||||
/system/bin/ip rule del to $ETH_NETWORK/$ETH_NETMASK 2>/dev/null || true
|
|
||||||
|
|
||||||
# Configure physical layer with ethtool (while interface is DOWN)
|
|
||||||
if [ -x "$SCRIPT_DIR/ethtool" ]; then
|
|
||||||
echo "Using ethtool from script directory: $SCRIPT_DIR/ethtool"
|
|
||||||
"$SCRIPT_DIR/ethtool" -s eth0 speed 10 duplex full autoneg off
|
|
||||||
# Try alternative path next
|
|
||||||
elif [ -x "/data/data/com.xypower.mpapp/files/ethtool" ]; then
|
|
||||||
echo "Configuring eth0 to 10Mbps full duplex..."
|
|
||||||
/data/data/com.xypower.mpapp/files/ethtool -s eth0 speed 10 duplex full autoneg off
|
|
||||||
else
|
|
||||||
echo "Warning: ethtool not found, falling back to sysfs configuration" >&2
|
|
||||||
# Try sysfs configuration as fallback
|
|
||||||
if [ -f "/sys/class/net/eth0/speed" ]; then
|
|
||||||
echo "off" > /sys/class/net/eth0/autoneg 2>/dev/null || true
|
|
||||||
echo "10" > /sys/class/net/eth0/speed 2>/dev/null || true
|
|
||||||
echo "full" > /sys/class/net/eth0/duplex 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ====================================================
|
|
||||||
# MTK Android 9 IP configuration with loss prevention
|
|
||||||
# ====================================================
|
|
||||||
|
|
||||||
# Configure IP address first while interface is DOWN
|
|
||||||
echo "Setting IP address while interface is DOWN..."
|
|
||||||
/system/bin/ip addr add $ETH_IP/$ETH_NETMASK broadcast $ETH_BROADCAST dev eth0
|
|
||||||
PRE_UP_IP=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
|
||||||
echo "IP configuration before UP: $PRE_UP_IP (1=configured, 0=missing)"
|
|
||||||
|
|
||||||
# Enable interface and wait for UP
|
|
||||||
echo "Bringing up interface..."
|
|
||||||
/system/bin/ip link set eth0 up
|
|
||||||
if [ "$ANDROID_VERSION" = "9" ]; then
|
|
||||||
sleep 3
|
|
||||||
else
|
|
||||||
# Use standard configuration for other devices
|
|
||||||
sleep 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if IP was lost after interface UP (common issue on MTK devices)
|
|
||||||
POST_UP_IP=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
|
||||||
echo "IP configuration after UP: $POST_UP_IP (1=retained, 0=lost)"
|
|
||||||
|
|
||||||
# IP address lost detection and recovery
|
|
||||||
if [ "$PRE_UP_IP" = "1" ] && [ "$POST_UP_IP" = "0" ]; then
|
|
||||||
echo "Warning: IP address was lost after bringing interface up - MTK issue detected"
|
|
||||||
echo "Reapplying IP configuration..."
|
|
||||||
/system/bin/ip addr add $ETH_IP/$ETH_NETMASK broadcast $ETH_BROADCAST dev eth0
|
|
||||||
|
|
||||||
# Check if reapplied configuration worked
|
|
||||||
FIXED_IP=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
|
||||||
echo "IP reapplication result: $FIXED_IP (1=success, 0=still missing)"
|
|
||||||
|
|
||||||
# If standard method fails, try MTK-specific approaches
|
|
||||||
if [ "$FIXED_IP" = "0" ]; then
|
|
||||||
echo "Standard IP configuration failed, trying MTK-specific methods"
|
|
||||||
|
|
||||||
# Try ifconfig if available (works better on some MTK devices)
|
|
||||||
if command -v ifconfig >/dev/null 2>&1; then
|
|
||||||
echo "Using ifconfig method..."
|
|
||||||
ifconfig eth0 $ETH_IP netmask 255.255.255.0 up
|
|
||||||
sleep 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Try Android's netd service if available
|
|
||||||
if [ -x "/system/bin/ndc" ]; then
|
|
||||||
echo "Using MTK netd service..."
|
|
||||||
/system/bin/ndc network interface setcfg eth0 $ETH_IP 255.255.255.0 up
|
|
||||||
sleep 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use loop to wait for interface UP instead of fixed sleep
|
|
||||||
WAITED=0
|
|
||||||
while [ $WAITED -lt $MAX_UP_WAIT ]; do
|
|
||||||
# Check both link status and IP configuration
|
|
||||||
IF_STATUS=$(/system/bin/ip link show eth0 | grep -c ",UP")
|
|
||||||
IP_STATUS=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
|
||||||
|
|
||||||
if [ "$IF_STATUS" = "1" ] && [ "$IP_STATUS" = "1" ]; then
|
|
||||||
echo "Interface is UP with correct IP after $WAITED seconds"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Waiting for interface UP with IP... ($WAITED/$MAX_UP_WAIT)"
|
|
||||||
|
|
||||||
# If interface is UP but IP is missing, reapply IP
|
|
||||||
if [ "$IF_STATUS" = "1" ] && [ "$IP_STATUS" = "0" ]; then
|
|
||||||
echo "Interface UP but IP missing, reapplying IP..."
|
|
||||||
/system/bin/ip addr add $ETH_IP/$ETH_NETMASK broadcast $ETH_BROADCAST dev eth0
|
|
||||||
fi
|
|
||||||
|
|
||||||
sleep 0.5
|
|
||||||
WAITED=$((WAITED+1))
|
|
||||||
done
|
|
||||||
|
|
||||||
# Final status check
|
|
||||||
FINAL_IF_STATUS=$(/system/bin/ip link show eth0 | grep -c ",UP")
|
|
||||||
FINAL_IP_STATUS=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
|
||||||
|
|
||||||
if [ "$FINAL_IF_STATUS" != "1" ] || [ "$FINAL_IP_STATUS" != "1" ]; then
|
|
||||||
echo "Warning: Failed to achieve stable interface state with IP" >&2
|
|
||||||
echo "Final interface status: $FINAL_IF_STATUS (1=UP, 0=DOWN)"
|
|
||||||
echo "Final IP status: $FINAL_IP_STATUS (1=configured, 0=missing)"
|
|
||||||
/system/bin/ip addr show eth0
|
|
||||||
else
|
|
||||||
echo "Successfully configured eth0 with IP $ETH_IP"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# First add to main routing table
|
|
||||||
/system/bin/ip route add $ETH_NETWORK/$ETH_NETMASK dev eth0 proto static scope link
|
|
||||||
|
|
||||||
# Then add to specified routing table
|
|
||||||
/system/bin/ip route add $ETH_NETWORK/$ETH_NETMASK dev eth0 proto static scope link table $ROUTE_TABLE
|
|
||||||
ADD_ROUTE_STATUS=$?
|
|
||||||
|
|
||||||
if [ $ADD_ROUTE_STATUS -eq 0 ]; then
|
|
||||||
echo "Add route successfully"
|
|
||||||
else
|
|
||||||
echo "Failed to add route: $ADD_ROUTE_STATUS" >&2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Only clear ARP and neighbor cache for eth0
|
|
||||||
/system/bin/ip neigh flush dev eth0
|
|
||||||
|
|
||||||
# Add routing rules - only flush cache once after rule is added
|
|
||||||
/system/bin/ip rule add from all to $ETH_NETWORK/$ETH_NETMASK lookup $ROUTE_TABLE prio 1000
|
|
||||||
/system/bin/ip route flush cache dev eth0
|
|
||||||
|
|
||||||
# Only enable forwarding for eth0 interface
|
|
||||||
echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding 2>/dev/null || true
|
|
||||||
|
|
||||||
# Wait for routing rules to take effect - using loop check instead of fixed wait
|
|
||||||
WAITED=0
|
|
||||||
while [ $WAITED -lt $MAX_ROUTE_WAIT ]; do
|
|
||||||
if /system/bin/ip rule | grep -q "$ETH_NETWORK/$ETH_NETMASK"; then
|
|
||||||
echo "Routing rules are now effective after $WAITED seconds"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
echo "Waiting for routing rules to take effect... ($WAITED/$MAX_ROUTE_WAIT)"
|
|
||||||
sleep 0.5
|
|
||||||
WAITED=$((WAITED+1))
|
|
||||||
done
|
|
||||||
|
|
||||||
# Display execution time
|
|
||||||
SCRIPT_END=$(date +%s)
|
|
||||||
TOTAL_TIME=$((SCRIPT_END - SCRIPT_START))
|
|
||||||
echo "Total script execution time: $TOTAL_TIME seconds"
|
|
||||||
exit 0
|
|
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -1,100 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Matthew on 2025/3/5.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MICROPHOTO_PTZCONTROLLER_H
|
|
||||||
#define MICROPHOTO_PTZCONTROLLER_H
|
|
||||||
|
|
||||||
#include <Buffer.h>
|
|
||||||
#include <thread>
|
|
||||||
#include <vector>
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
#include <mutex>
|
|
||||||
#include <SemaphoreEx.h>
|
|
||||||
#include <Client/Device.h>
|
|
||||||
|
|
||||||
enum PROC_PTZ_STATE
|
|
||||||
{
|
|
||||||
PTZS_POWER_OFF = 0,
|
|
||||||
PTZS_IDLE = 1,
|
|
||||||
PTZS_SELF_TESTING = 2,
|
|
||||||
PTZS_MOVING = 3,
|
|
||||||
PTZS_TAKING_PHOTO = 4,
|
|
||||||
PTZS_PHOTO_SELF_TESTING = 5,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define CAMERA_SELF_TEST_TIME 150 /* Camera self-test time (excluding PTZ self-test)*/
|
|
||||||
#define MOVE_PRESET_WAIT_TIME 20 /* Waiting for the maximum time for the PTZ to move to the preset position*/
|
|
||||||
#define CAMERA_CLOSE_DELAYTIME 360 /* Auto Power-Off Timer Setting After Manual Power-On (for Camera)*/
|
|
||||||
#define PHOTO_OPEN_POWER 16000
|
|
||||||
#define WAIT_TIME_AUTO_CLOSE 2 /* In order to automatically capture multiple preset point images at the same time and prevent the camera from self checking every time it takes a picture.*/
|
|
||||||
|
|
||||||
class PtzPhotoParams
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PtzPhotoParams(const IDevice::PHOTO_INFO& photoInfo, const std::string& path, const std::vector<IDevice::OSD_INFO>& osds) :
|
|
||||||
mPhotoInfo(photoInfo), mPath(path), mOsds(osds)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
~PtzPhotoParams()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
IDevice::PHOTO_INFO mPhotoInfo;
|
|
||||||
std::string mPath;
|
|
||||||
std::vector<IDevice::OSD_INFO> mOsds;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SERIAL_CMD
|
|
||||||
{
|
|
||||||
uint8_t channel;
|
|
||||||
uint8_t preset;
|
|
||||||
time_t ts;
|
|
||||||
int cmdidx;
|
|
||||||
uint32_t delayTime;
|
|
||||||
uint8_t bImageSize;
|
|
||||||
char serfile[128];
|
|
||||||
uint32_t baud;
|
|
||||||
int addr;
|
|
||||||
std::shared_ptr<PtzPhotoParams> photoParams;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class CPhoneDevice;
|
|
||||||
class PtzController
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PtzController(CPhoneDevice* pPhoneDevice);
|
|
||||||
|
|
||||||
void Startup();
|
|
||||||
// ();
|
|
||||||
void AddCommand(uint8_t channel, int cmdidx, uint8_t bImageSize, uint8_t preset, const char *serfile, uint32_t baud, int addr);
|
|
||||||
void AddPhotoCommand(IDevice::PHOTO_INFO& photoInfo, const std::string& path, const std::vector<IDevice::OSD_INFO>& osds);
|
|
||||||
|
|
||||||
void ExitAndWait();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
static void PtzThreadProc(PtzController* pThis);
|
|
||||||
|
|
||||||
void PtzProc();
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::mutex m_locker;
|
|
||||||
std::vector<SERIAL_CMD> m_cmds;
|
|
||||||
|
|
||||||
CSemaphore m_sem;
|
|
||||||
bool m_exit;
|
|
||||||
|
|
||||||
std::thread m_thread;
|
|
||||||
|
|
||||||
CPhoneDevice* m_pPhoneDevice;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //MICROPHOTO_PTZCONTROLLER_H
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,724 +0,0 @@
|
|||||||
/* Copyright Statement:
|
|
||||||
*
|
|
||||||
* This software/firmware and related documentation ("MediaTek Software") are
|
|
||||||
* protected under relevant copyright laws. The information contained herein is
|
|
||||||
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
|
|
||||||
* the prior written permission of MediaTek inc. and/or its licensors, any
|
|
||||||
* reproduction, modification, use or disclosure of MediaTek Software, and
|
|
||||||
* information contained herein, in whole or in part, shall be strictly
|
|
||||||
* prohibited.
|
|
||||||
*
|
|
||||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
|
||||||
*
|
|
||||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
|
||||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
|
||||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
|
||||||
* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
|
|
||||||
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
|
||||||
* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
|
|
||||||
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
|
||||||
* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
|
|
||||||
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
|
||||||
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
|
||||||
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
|
|
||||||
* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
|
|
||||||
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
|
||||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
|
|
||||||
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
|
|
||||||
* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
|
|
||||||
* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
|
||||||
* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
|
||||||
*
|
|
||||||
* The following software/firmware and/or related documentation ("MediaTek
|
|
||||||
* Software") have been modified by MediaTek Inc. All revisions are subject to
|
|
||||||
* any receiver's applicable license agreements with MediaTek Inc.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _MTK_HARDWARE_MTKCAM_INCLUDE_MTKCAM_UTILS_METADATA_HAL_MTKPLATFORMMETADATATAG_H_
|
|
||||||
#define _MTK_HARDWARE_MTKCAM_INCLUDE_MTKCAM_UTILS_METADATA_HAL_MTKPLATFORMMETADATATAG_H_
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
typedef enum mtk_platform_metadata_section {
|
|
||||||
MTK_HAL_REQUEST = 0xC000, // MTK HAL internal metadata become from 0xC000 0000
|
|
||||||
MTK_P1NODE,
|
|
||||||
MTK_P2NODE,
|
|
||||||
MTK_3A_TUNINING,
|
|
||||||
MTK_3A_EXIF,
|
|
||||||
MTK_MF_EXIF,
|
|
||||||
MTK_EIS,
|
|
||||||
MTK_STEREO,
|
|
||||||
MTK_FRAMESYNC,
|
|
||||||
MTK_VHDR,
|
|
||||||
MTK_PIPELINE,
|
|
||||||
MTK_NR,
|
|
||||||
MTK_PLUGIN,
|
|
||||||
MTK_DUALZOOM,
|
|
||||||
MTK_FEATUREPIPE,
|
|
||||||
MTK_POSTPROC,
|
|
||||||
MTK_FEATURE,
|
|
||||||
MTK_FSC,
|
|
||||||
} mtk_platform_metadata_section_t;
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
typedef enum mtk_platform_metadata_section_start {
|
|
||||||
MTK_HAL_REQUEST_START = MTK_HAL_REQUEST << 16,
|
|
||||||
MTK_P1NODE_START = MTK_P1NODE << 16,
|
|
||||||
MTK_P2NODE_START = MTK_P2NODE << 16,
|
|
||||||
MTK_3A_TUNINING_START = MTK_3A_TUNINING << 16,
|
|
||||||
MTK_3A_EXIF_START = MTK_3A_EXIF << 16,
|
|
||||||
MTK_EIS_START = MTK_EIS << 16,
|
|
||||||
MTK_STEREO_START = MTK_STEREO << 16,
|
|
||||||
MTK_FRAMESYNC_START = MTK_FRAMESYNC << 16,
|
|
||||||
MTK_VHDR_START = MTK_VHDR << 16,
|
|
||||||
MTK_PIPELINE_START = MTK_PIPELINE << 16,
|
|
||||||
MTK_NR_START = MTK_NR << 16,
|
|
||||||
MTK_PLUGIN_START = MTK_PLUGIN << 16,
|
|
||||||
MTK_DUALZOOM_START = MTK_DUALZOOM << 16,
|
|
||||||
MTK_FEATUREPIPE_START = MTK_FEATUREPIPE << 16,
|
|
||||||
MTK_POSTPROC_START = MTK_POSTPROC << 16,
|
|
||||||
MTK_FEATURE_START = MTK_FEATURE << 16,
|
|
||||||
MTK_FSC_START = MTK_FSC << 16,
|
|
||||||
} mtk_platform_metadata_section_start_t;
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
typedef enum mtk_platform_metadata_tag {
|
|
||||||
MTK_HAL_REQUEST_REQUIRE_EXIF = MTK_HAL_REQUEST_START, //MUINT8
|
|
||||||
MTK_HAL_REQUEST_DUMP_EXIF, //MUINT8
|
|
||||||
MTK_HAL_REQUEST_REPEAT, //MUINT8
|
|
||||||
MTK_HAL_REQUEST_DUMMY, //MUINT8
|
|
||||||
MTK_HAL_REQUEST_SENSOR_SIZE, //MSize
|
|
||||||
MTK_HAL_REQUEST_SENSOR_ID, //MINT32
|
|
||||||
MTK_HAL_REQUEST_DEVICE_ID, //MINT32
|
|
||||||
MTK_HAL_REQUEST_HIGH_QUALITY_CAP, //MUINT8
|
|
||||||
MTK_HAL_REQUEST_ISO_SPEED, //MINT32
|
|
||||||
MTK_HAL_REQUEST_BRIGHTNESS_MODE, //MINT32
|
|
||||||
MTK_HAL_REQUEST_CONTRAST_MODE, //MINT32
|
|
||||||
MTK_HAL_REQUEST_HUE_MODE, //MINT32
|
|
||||||
MTK_HAL_REQUEST_SATURATION_MODE, //MINT32
|
|
||||||
MTK_HAL_REQUEST_EDGE_MODE, //MINT32
|
|
||||||
MTK_HAL_REQUEST_PASS1_DISABLE, //MINT32
|
|
||||||
MTK_HAL_REQUEST_ERROR_FRAME, // used for error handling //MUINT8
|
|
||||||
MTK_HAL_REQUEST_PRECAPTURE_START, // 4cell //MUINT8
|
|
||||||
MTK_HAL_REQUEST_AF_TRIGGER_START, // 4cell //MUINT8
|
|
||||||
MTK_HAL_REQUEST_IMG_IMGO_FORMAT, //MINT32
|
|
||||||
MTK_HAL_REQUEST_IMG_RRZO_FORMAT, //MINT32
|
|
||||||
MTK_HAL_REQUEST_INDEX, //MINT32
|
|
||||||
MTK_HAL_REQUEST_COUNT, //MINT32
|
|
||||||
MTK_HAL_REQUEST_SMVR_FPS, //MUINT8 // 0: NOT batch request
|
|
||||||
MTK_HAL_REQUEST_REMOSAIC_ENABLE, //MUINT8 // 0: preview mode 1: capture mode
|
|
||||||
MTK_HAL_REQUEST_INDEX_BSS, //MINT32
|
|
||||||
MTK_HAL_REQUEST_ZSD_CAPTURE_INTENT, //MUINT8
|
|
||||||
MTK_HAL_REQUEST_REAL_CAPTURE_SIZE, //MSize
|
|
||||||
MTK_HAL_REQUEST_VIDEO_SIZE, //MSize
|
|
||||||
MTK_HAL_REQUEST_RAW_IMAGE_INFO, //MINT32 // index[0]: raw fmt, index[1]: raw stride, index[2]: raw size(width), index[3]: raw size(height)
|
|
||||||
MTK_HAL_REQUEST_ISP_PIPELINE_MODE, //MINT32
|
|
||||||
MTK_P1NODE_SCALAR_CROP_REGION = MTK_P1NODE_START, //MRect
|
|
||||||
MTK_P1NODE_BIN_CROP_REGION, //MRect
|
|
||||||
MTK_P1NODE_DMA_CROP_REGION, //MRect
|
|
||||||
MTK_P1NODE_BIN_SIZE, //MSize
|
|
||||||
MTK_P1NODE_RESIZER_SIZE, //MSize
|
|
||||||
MTK_P1NODE_RESIZER_SET_SIZE, //MSize
|
|
||||||
MTK_P1NODE_CTRL_RESIZE_FLUSH, //MBOOL
|
|
||||||
MTK_P1NODE_CTRL_READOUT_FLUSH, //MBOOL
|
|
||||||
MTK_P1NODE_CTRL_RECONFIG_SENSOR_SETTING, //MBOOL
|
|
||||||
MTK_P1NODE_PROCESSOR_MAGICNUM, //MINT32
|
|
||||||
MTK_P1NODE_MIN_FRM_DURATION, //MINT64
|
|
||||||
MTK_P1NODE_RAW_TYPE, //MINT32
|
|
||||||
MTK_P1NODE_SENSOR_CROP_REGION, //MRect
|
|
||||||
MTK_P1NODE_YUV_RESIZER1_CROP_REGION, //MRect
|
|
||||||
MTK_P1NODE_YUV_RESIZER2_CROP_REGION, //MRect
|
|
||||||
MTK_P1NODE_YUV_RESIZER1_SIZE, //MSize
|
|
||||||
MTK_P1NODE_SENSOR_MODE, //MINT32
|
|
||||||
MTK_P1NODE_SENSOR_VHDR_MODE, //MINT32
|
|
||||||
MTK_P1NODE_METADATA_TAG_INDEX, //MINT32
|
|
||||||
MTK_P1NODE_RSS_SIZE, //MSize
|
|
||||||
MTK_P1NODE_SENSOR_STATUS, //MINT32
|
|
||||||
MTK_P1NODE_SENSOR_RAW_ORDER, //MINT32
|
|
||||||
MTK_P1NODE_TWIN_SWITCH, //MINT32
|
|
||||||
MTK_P1NODE_TWIN_STATUS, //MINT32
|
|
||||||
MTK_P1NODE_RESIZE_QUALITY_SWITCH, //MINT32
|
|
||||||
MTK_P1NODE_RESIZE_QUALITY_STATUS, //MINT32
|
|
||||||
MTK_P1NODE_RESIZE_QUALITY_LEVEL, //MINT32
|
|
||||||
MTK_P1NODE_RESIZE_QUALITY_SWITCHING, //MBOOL
|
|
||||||
MTK_P1NODE_RESUME_SHUTTER_TIME_US, //MINT32
|
|
||||||
MTK_P1NODE_FRAME_START_TIMESTAMP, //MINT64
|
|
||||||
MTK_P1NODE_FRAME_START_TIMESTAMP_BOOT, //MINT64
|
|
||||||
MTK_P1NODE_REQUEST_PROCESSED_WITHOUT_WB, //MBOOL
|
|
||||||
MTK_P1NODE_ISNEED_GMV, //MBOOL
|
|
||||||
MTK_P2NODE_HIGH_SPEED_VDO_FPS = MTK_P2NODE_START, //MINT32
|
|
||||||
MTK_P2NODE_HIGH_SPEED_VDO_SIZE, //MSize
|
|
||||||
MTK_P2NODE_CTRL_CALTM_ENABLE, //MBOOL
|
|
||||||
MTK_P2NODE_FD_CROP_REGION, //MRect
|
|
||||||
MTK_P2NODE_CROP_REGION, //MRect // for removing black edge
|
|
||||||
MTK_P2NODE_DSDN_ENABLE, //MBOOL // for DSDN on/off controled by Policy
|
|
||||||
MTK_P2NODE_SENSOR_CROP_REGION, //MRect
|
|
||||||
MTK_3A_AE_HIGH_ISO_BINNING, //MBOOL // for 3HDR high iso binning mode
|
|
||||||
MTK_SENSOR_SCALER_CROP_REGION, //MRect
|
|
||||||
MTK_PROCESSOR_CAMINFO = MTK_3A_TUNINING_START, //IMemory
|
|
||||||
MTK_ISP_ATMS_MAPPING_INFO, //IMemory
|
|
||||||
MTK_3A_ISP_PROFILE, //MUINT8
|
|
||||||
MTK_3A_ISP_P1_PROFILE, //MUINT8
|
|
||||||
MTK_CAMINFO_LCSOUT_INFO, //IMemory
|
|
||||||
MTK_3A_ISP_BYPASS_LCE, //MBOOL
|
|
||||||
MTK_3A_ISP_DISABLE_NR, //MBOOL
|
|
||||||
MTK_3A_ISP_NR3D_SW_PARAMS, //MINT32[14] //GMVX, GMVY, confX, confY, MAX_GMV, frameReset, GMV_Status,ISO_cutoff
|
|
||||||
MTK_3A_ISP_NR3D_HW_PARAMS, //IMemory
|
|
||||||
MTK_3A_ISP_LCE_GAIN, //MINT32, bits[0:15]: LCE gain, bits[16:31]: LCE gain confidence ratio (0-100)
|
|
||||||
MTK_3A_ISP_FUS_NUM, //MINT32
|
|
||||||
MTK_3A_AE_CAP_PARAM, //IMemory
|
|
||||||
MTK_3A_AE_CAP_SINGLE_FRAME_HDR, //MUINT8
|
|
||||||
MTK_3A_AE_BV_TRIGGER, //MBOOL
|
|
||||||
MTK_3A_AF_LENS_POSITION, //MINT32
|
|
||||||
MTK_3A_FLICKER_RESULT, //MINT32
|
|
||||||
MTK_3A_DUMMY_BEFORE_REQUEST_FRAME, //MBOOL // Dummy frame before capture, only for capture intent, preview don't use
|
|
||||||
MTK_3A_DUMMY_AFTER_REQUEST_FRAME, //MBOOL // Dummy frame after capture, only for capture intent, preview don't use
|
|
||||||
MTK_3A_MANUAL_AWB_COLORTEMPERATURE_MAX, //MINT32
|
|
||||||
MTK_3A_MANUAL_AWB_COLORTEMPERATURE_MIN, //MINT32
|
|
||||||
MTK_3A_MANUAL_AWB_COLORTEMPERATURE, //MINT32
|
|
||||||
MTK_3A_HDR_MODE, //MUINT8
|
|
||||||
MTK_3A_AE_HDR_MIXED_ISO, //MUINT32
|
|
||||||
MTK_3A_AE_ZSL_STABLE, //MINT32 ( MBOOL )
|
|
||||||
MTK_3A_PGN_ENABLE, //MUINT8
|
|
||||||
MTK_3A_SKIP_HIGH_QUALITY_CAPTURE, //MUINT8
|
|
||||||
MTK_3A_AI_SHUTTER, //MBOOL
|
|
||||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL, //MINT32
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE, //MINT32
|
|
||||||
MTK_3A_OPEN_ID, //MINT32
|
|
||||||
MTK_LSC_TBL_DATA, //IMemory
|
|
||||||
MTK_LSC_TSF_DATA, //IMemory
|
|
||||||
MTK_LSC_TSF_DUMP_NO, //IMemory
|
|
||||||
MTK_ISP_P2_ORIGINAL_SIZE, //MSize
|
|
||||||
MTK_ISP_P2_CROP_REGION, //MRect
|
|
||||||
MTK_ISP_P2_RESIZER_SIZE, //MSize
|
|
||||||
MTK_ISP_P2_IN_IMG_FMT, //MINT32, 0 or not exist: RAW->YUV, 1: YUV->YUV
|
|
||||||
MTK_ISP_P2_TUNING_UPDATE_MODE, //MUINT8, [0 or not exist]: as default; [1]: keep existed parameters but some parts will be updated; [2]: keep all existed parameters (force mode) [3] LPCNR Pass1 [4] LPCNR Pass2
|
|
||||||
MTK_ISP_P2_IN_IMG_RES_REVISED, //MINT32, describes P2 input image revised resolution. bit[0:15] width in pixel, bit[16:31] height in pixel. May be not exist.
|
|
||||||
MTK_ISP_APP_TARGET_SIZE, //MINT32, describes APP Target resolution. bit[0:15] width in pixel, bit[16:31] height in pixel. May be not exist.
|
|
||||||
MTK_MSF_SCALE_INDEX, //MINT32, which scale stage index, would only exist with scaling flow
|
|
||||||
MTK_MSF_FRAME_NUM, //MINT32, After BSS which frame number is this stage using
|
|
||||||
MTK_TOTAL_MULTI_FRAME_NUM, //MINT32, MSYUV fuction used this input to know frame nunber
|
|
||||||
MTK_TOTAL_MULTI_FRAME_NUM_CAPTURED, //MINT32, MSF function used
|
|
||||||
MTK_SW_DSDN_VERSION, //MINT32, distinguish different dsdn version
|
|
||||||
MTK_ISP_COLOR_SPACE, //MINT32
|
|
||||||
MTK_ISP_DRC_CURVE, //IMemory
|
|
||||||
MTK_ISP_DRC_CURVE_SIZE, //MINT32
|
|
||||||
MTK_ISP_FEO_DATA, //IMemory
|
|
||||||
MTK_ISP_FEO_ENABLE, //MINT32
|
|
||||||
MTK_ISP_FEO_INFO, //IMemory
|
|
||||||
MTK_ISP_HLR_RATIO, //MINT32, which is a HDR ratio applied in HLR
|
|
||||||
MTK_ISP_STAGE, //MINT32
|
|
||||||
MTK_FOCUS_AREA_POSITION, //MINT32
|
|
||||||
MTK_FOCUS_AREA_SIZE, //MSize
|
|
||||||
MTK_FOCUS_AREA_RESULT, //MUINT8
|
|
||||||
MTK_FOCUS_PAUSE, //MUINT8
|
|
||||||
MTK_FOCUS_MZ_ON, //MUINT8
|
|
||||||
MTK_3A_AF_FOCUS_VALUE, //MINT64
|
|
||||||
MTK_3A_PRV_CROP_REGION, //MRect
|
|
||||||
MTK_3A_ISP_MDP_TARGET_SIZE, //MSize
|
|
||||||
MTK_3A_REPEAT_RESULT, //MUINT8
|
|
||||||
MTK_3A_SKIP_PRECAPTURE, //MBOOL //if CUST_ENABLE_FLASH_DURING_TOUCH is true, MW can skip precapture
|
|
||||||
MTK_3A_SKIP_BAD_FRAME, //MBOOL
|
|
||||||
MTK_3A_FLARE_IN_MANUAL_CTRL_ENABLE, //MBOOL
|
|
||||||
MTK_3A_DYNAMIC_SUBSAMPLE_COUNT, //MINT32 30fps = 1, 60fps = 2, ... , 120fps = 4
|
|
||||||
MTK_3A_AE_LV_VALUE, //MINT32
|
|
||||||
MTK_APP_CONTROL, //MINT32
|
|
||||||
MTK_3A_CUST_PARAMS, //IMemory
|
|
||||||
MTK_3A_SETTING_CUST_PARAMS, //IMemory
|
|
||||||
MTK_3A_PERFRAME_INFO, //IMemory
|
|
||||||
MTK_SENSOR_MODE_INFO_ACTIVE_ARRAY_CROP_REGION, //MRect
|
|
||||||
MTK_3A_AE_BV, //MINT32
|
|
||||||
MTK_3A_AE_CWV, //MINT32
|
|
||||||
MTK_ISP_P2_PROCESSED_RAW, //MINT32
|
|
||||||
MTK_3A_EXIF_METADATA = MTK_3A_EXIF_START, //IMetadata
|
|
||||||
MTK_EIS_REGION = MTK_EIS_START, //MINT32
|
|
||||||
MTK_EIS_INFO, //MINT64
|
|
||||||
MTK_EIS_VIDEO_SIZE, //MRect
|
|
||||||
MTK_EIS_NEED_OVERRIDE_TIMESTAMP, //MBOOL
|
|
||||||
MTK_EIS_LMV_DATA, //IMemory
|
|
||||||
MTK_STEREO_JPS_MAIN1_CROP = MTK_STEREO_START, //MRect
|
|
||||||
MTK_STEREO_JPS_MAIN2_CROP, //MRect
|
|
||||||
MTK_STEREO_SYNC2A_MODE, //MINT32
|
|
||||||
MTK_STEREO_SYNCAF_MODE, //MINT32
|
|
||||||
MTK_STEREO_HW_FRM_SYNC_MODE, //MINT32
|
|
||||||
MTK_STEREO_NOTIFY, //MINT32
|
|
||||||
MTK_STEREO_SYNC2A_MASTER_SLAVE, //MINT32[2]
|
|
||||||
MTK_STEREO_SYNC2A_STATUS, //IMemory
|
|
||||||
MTK_JPG_ENCODE_TYPE, //MINT8
|
|
||||||
MTK_CONVERGENCE_DEPTH_OFFSET, //MFLOAT
|
|
||||||
MTK_N3D_WARPING_MATRIX_SIZE, //MUINT32
|
|
||||||
MTK_P1NODE_MAIN2_HAL_META, //IMetadata
|
|
||||||
MTK_P2NODE_BOKEH_ISP_PROFILE, //MUINT8
|
|
||||||
MTK_STEREO_FEATURE_DENOISE_MODE, //MINT32
|
|
||||||
MTK_STEREO_FEATURE_SENSOR_PROFILE, //MINT32
|
|
||||||
MTK_P1NODE_MAIN2_APP_META, //IMetadata
|
|
||||||
MTK_STEREO_FEATURE_OPEN_ID, //MINT32
|
|
||||||
MTK_STEREO_FRAME_PER_CAPTURE, //MINT32
|
|
||||||
MTK_STEREO_ENABLE_MFB, //MINT32
|
|
||||||
MTK_STEREO_BSS_RESULT, //MINT32
|
|
||||||
MTK_STEREO_FEATURE_FOV_CROP_REGION, //MINT32[6] // p.x, p.y, p.w, p.h, srcW, srcH
|
|
||||||
MTK_STEREO_DCMF_FEATURE_MODE, //MINT32 // mtk_platform_metadata_enum_dcmf_feature_mode
|
|
||||||
MTK_STEREO_HDR_EV, //MINT32
|
|
||||||
MTK_STEREO_DELAY_FRAME_COUNT, //MINT32
|
|
||||||
MTK_STEREO_DCMF_DEPTHMAP_SIZE, //MSize
|
|
||||||
MTK_STEREO_WITH_CAMSV, //MBOOL
|
|
||||||
MTK_FRAMESYNC_ID = MTK_FRAMESYNC_START, //MINT32
|
|
||||||
MTK_FRAMESYNC_TOLERANCE, //MINT64
|
|
||||||
MTK_FRAMESYNC_FAILHANDLE, //MINT32
|
|
||||||
MTK_FRAMESYNC_RESULT, //MINT64
|
|
||||||
MTK_FRAMESYNC_TYPE, //MINT32
|
|
||||||
MTK_FRAMESYNC_MODE, //MUINT8
|
|
||||||
MTK_VHDR_LCEI_DATA = MTK_VHDR_START, //Memory
|
|
||||||
MTK_VHDR_IMGO_3A_ISP_PROFILE, //MUINT8
|
|
||||||
MTK_HDR_FEATURE_HDR_HAL_MODE,
|
|
||||||
MTK_3A_FEATURE_AE_VALID_EXPOSURE_NUM,
|
|
||||||
MTK_VHDR_MULTIFRAME_TIMESTAMP, //MINT64
|
|
||||||
MTK_VHDR_MULTIFRAME_EXPOSURE_TIME, //MINT64
|
|
||||||
MTK_PIPELINE_UNIQUE_KEY = MTK_PIPELINE_START, //MINT32
|
|
||||||
MTK_PIPELINE_FRAME_NUMBER, //MINT32
|
|
||||||
MTK_PIPELINE_REQUEST_NUMBER, //MINT32
|
|
||||||
MTK_PIPELINE_EV_VALUE, //MINT32
|
|
||||||
MTK_PIPELINE_DUMP_UNIQUE_KEY, //MINT32
|
|
||||||
MTK_PIPELINE_DUMP_FRAME_NUMBER, //MINT32
|
|
||||||
MTK_PIPELINE_DUMP_REQUEST_NUMBER, //MINT32
|
|
||||||
MTK_PIPELINE_VIDEO_RECORD, //MINT32
|
|
||||||
MTK_NR_MODE = MTK_NR_START, //MINT32
|
|
||||||
MTK_NR_MNR_THRESHOLD_ISO, //MINT32
|
|
||||||
MTK_NR_SWNR_THRESHOLD_ISO, //MINT32
|
|
||||||
MTK_REAL_LV, //MINT32
|
|
||||||
MTK_ANALOG_GAIN, //MUINT32
|
|
||||||
MTK_AWB_RGAIN, //MINT32
|
|
||||||
MTK_AWB_GGAIN, //MINT32
|
|
||||||
MTK_AWB_BGAIN, //MINT32
|
|
||||||
MTK_PLUGIN_MODE = MTK_PLUGIN_START, //MINT64
|
|
||||||
MTK_PLUGIN_COMBINATION_KEY, //MINT64
|
|
||||||
MTK_PLUGIN_P2_COMBINATION, //MINT64
|
|
||||||
MTK_PLUGIN_PROCESSED_FRAME_COUNT, //MINT32
|
|
||||||
MTK_PLUGIN_CUSTOM_HINT, //MINT32
|
|
||||||
MTK_PLUGIN_DETACT_JOB_SYNC_TOKEN, //MINT64, may be not exists.
|
|
||||||
MTK_PLUGIN_UNIQUEKEY,
|
|
||||||
MTK_DUALZOOM_DROP_REQ = MTK_DUALZOOM_START, //MINT32
|
|
||||||
MTK_DUALZOOM_FORCE_ENABLE_P2, //MINT32
|
|
||||||
MTK_DUALZOOM_DO_FRAME_SYNC, //MINT32
|
|
||||||
MTK_DUALZOOM_ZOOM_FACTOR, //MINT32
|
|
||||||
MTK_DUALZOOM_DO_FOV, //MINT32
|
|
||||||
MTK_DUALZOOM_FOV_RECT_INFO, //MINT32
|
|
||||||
MTK_DUALZOOM_FOV_CALB_INFO, //MINT32
|
|
||||||
MTK_DUALZOOM_FOV_MARGIN_PIXEL, //MSize
|
|
||||||
MTK_DUALCAM_AF_STATE, //MUINT8
|
|
||||||
MTK_DUALCAM_LENS_STATE, //MUINT8
|
|
||||||
MTK_DUALCAM_TIMESTAMP, //MINT64
|
|
||||||
MTK_DUALZOOM_3DNR_MODE, //MINT32
|
|
||||||
MTK_DUALZOOM_ZOOMRATIO, //MINT32
|
|
||||||
MTK_DUALZOOM_CENTER_SHIFT, //MINT32
|
|
||||||
MTK_DUALZOOM_FOV_RATIO, //MFLOAT
|
|
||||||
MTK_DUALZOOM_REAL_MASTER, //MINT32
|
|
||||||
MTK_DUALZOOM_FD_TARGET_MASTER, //MINT32
|
|
||||||
MTK_DUALZOOM_FD_REAL_MASTER, //MINT32 // maybe not set
|
|
||||||
MTK_LMV_SEND_SWITCH_OUT, //MINT32
|
|
||||||
MTK_LMV_SWITCH_OUT_RESULT, //MINT32
|
|
||||||
MTK_LMV_VALIDITY, //MINT32
|
|
||||||
MTK_VSDOF_P1_MAIN1_ISO, //MINT32
|
|
||||||
MTK_DUALZOOM_IS_STANDBY, //MBOOL
|
|
||||||
MTK_DUALZOOM_CAP_CROP, //MRect
|
|
||||||
MTK_DUALZOOM_MASTER_UPDATE_MODE, //MBOOL
|
|
||||||
MTK_DUALZOOM_STREAMING_NR, //MINT32
|
|
||||||
MTK_FEATUREPIPE_APP_MODE = MTK_FEATUREPIPE_START, //MINT32
|
|
||||||
MTK_POSTPROC_TYPE = MTK_POSTPROC_START, //MINT32
|
|
||||||
MTK_FEATURE_STREAMING = MTK_FEATURE_START, //MINT64
|
|
||||||
MTK_FEATURE_CAPTURE, //MINT64
|
|
||||||
MTK_FEATURE_CAPTURE_PHYSICAL, //MINT64
|
|
||||||
MTK_FEATURE_FREE_MEMORY_MBYTE, //MINT32
|
|
||||||
MTK_FEATURE_MFNR_NVRAM_QUERY_INDEX, //MINT32
|
|
||||||
MTK_FEATURE_MFNR_NVRAM_DECISION_ISO, //MINT32
|
|
||||||
MTK_FEATURE_MFNR_TUNING_INDEX_HINT, //MINT64
|
|
||||||
MTK_FEATURE_MFNR_FINAL_EXP, //MINT32
|
|
||||||
MTK_FEATURE_MFNR_OPEN_ID, //MINT32
|
|
||||||
MTK_FEATURE_AINR_MDLA_MODE, //MINT32
|
|
||||||
MTK_ISP_AINR_MDLA_MODE, //MINT32
|
|
||||||
MTK_ISP_LTM_BIT_MODE, //MINT32
|
|
||||||
MTK_FEATURE_BSS_SELECTED_FRAME_COUNT, //MINT32
|
|
||||||
MTK_FEATURE_BSS_FORCE_DROP_NUM, //MINT32
|
|
||||||
MTK_FEATURE_BSS_FIXED_LSC_TBL_DATA, //MUINT8
|
|
||||||
MTK_FEATURE_BSS_PROCESS, //MINT32
|
|
||||||
MTK_FEATURE_BSS_ISGOLDEN, //MBOOL
|
|
||||||
MTK_FEATURE_BSS_REORDER, //MBOOL
|
|
||||||
MTK_FEATURE_BSS_MANUAL_ORDER, //MUINT8
|
|
||||||
MTK_FEATURE_BSS_RRZO_DATA, //MUINT8
|
|
||||||
MTK_FEATURE_BSS_DOWNSAMPLE, //MBOOL
|
|
||||||
MTK_FEATURE_PACK_RRZO, //MUINT8
|
|
||||||
MTK_FEATURE_FACE_RECTANGLES, //MRect array
|
|
||||||
MTK_FEATURE_FACE_POSE_ORIENTATIONS, //MINT32[n*3] array, each struct include: xAsix, yAsix, zAsix
|
|
||||||
MTK_FEATURE_CAP_YUV_PROCESSING, //MUINT8
|
|
||||||
MTK_FEATURE_CAP_PIPE_DCE_CONTROL, //MUINT8
|
|
||||||
MTK_FEATURE_MULTIFRAMENODE_BYPASSED, //MUINT8
|
|
||||||
MTK_FEATURE_FACE_APPLIED_GAMMA, //MINT32
|
|
||||||
MTK_FEATURE_CAP_PQ_USERID, //MINT64
|
|
||||||
MTK_FEATURE_FLIP_IN_P2A, //MINT32
|
|
||||||
MTK_FSC_CROP_DATA = MTK_FSC_START, //IMemory
|
|
||||||
MTK_FSC_WARP_DATA, //IMemory
|
|
||||||
MTK_STAGGER_ME_META, //IMetadata
|
|
||||||
MTK_STAGGER_SE_META, //IMetadata
|
|
||||||
MTK_STAGGER_BLOB_IMGO_ORDER //MUINT8
|
|
||||||
} mtk_platform_metadata_tag_t;
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
typedef enum mtk_platform_3a_exif_metadata_tag {
|
|
||||||
MTK_3A_EXIF_FNUMBER, //MINT32
|
|
||||||
MTK_3A_EXIF_FOCAL_LENGTH, //MINT32
|
|
||||||
MTK_3A_EXIF_FOCAL_LENGTH_35MM, //MINT32
|
|
||||||
MTK_3A_EXIF_SCENE_MODE, //MINT32
|
|
||||||
MTK_3A_EXIF_AWB_MODE, //MINT32
|
|
||||||
MTK_3A_EXIF_LIGHT_SOURCE, //MINT32
|
|
||||||
MTK_3A_EXIF_EXP_PROGRAM, //MINT32
|
|
||||||
MTK_3A_EXIF_SCENE_CAP_TYPE, //MINT32
|
|
||||||
MTK_3A_EXIF_FLASH_LIGHT_TIME_US, //MINT32
|
|
||||||
MTK_3A_EXIF_AE_METER_MODE, //MINT32
|
|
||||||
MTK_3A_EXIF_AE_EXP_BIAS, //MINT32
|
|
||||||
MTK_3A_EXIF_CAP_EXPOSURE_TIME, //MINT32
|
|
||||||
MTK_3A_EXIF_AE_ISO_SPEED, //MINT32
|
|
||||||
MTK_3A_EXIF_REAL_ISO_VALUE, //MINT32
|
|
||||||
MTK_3A_EXIF_AE_BRIGHTNESS_VALUE, //MINT32
|
|
||||||
MTK_3A_EXIF_FLASH_FIRING_STATUS, //MINT32
|
|
||||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION, //MINT32
|
|
||||||
MTK_3A_EXIF_FLASH_MODE, //MINT32
|
|
||||||
MTK_3A_EXIF_FLASH_FUNCTION, //MINT32
|
|
||||||
MTK_3A_EXIF_FLASH_REDEYE, //MINT32
|
|
||||||
MTK_3A_EXIF_DEBUGINFO_BEGIN, // debug info begin
|
|
||||||
// key: MINT32
|
|
||||||
MTK_3A_EXIF_DBGINFO_AAA_KEY = MTK_3A_EXIF_DEBUGINFO_BEGIN, //MINT32
|
|
||||||
MTK_3A_EXIF_DBGINFO_AAA_DATA,
|
|
||||||
MTK_3A_EXIF_DBGINFO_SDINFO_KEY,
|
|
||||||
MTK_3A_EXIF_DBGINFO_SDINFO_DATA,
|
|
||||||
MTK_3A_EXIF_DBGINFO_ISP_KEY,
|
|
||||||
MTK_3A_EXIF_DBGINFO_ISP_DATA,
|
|
||||||
//
|
|
||||||
MTK_CMN_EXIF_DBGINFO_KEY,
|
|
||||||
MTK_CMN_EXIF_DBGINFO_DATA,
|
|
||||||
//
|
|
||||||
MTK_MF_EXIF_DBGINFO_MF_KEY,
|
|
||||||
MTK_MF_EXIF_DBGINFO_MF_DATA,
|
|
||||||
//
|
|
||||||
MTK_N3D_EXIF_DBGINFO_KEY,
|
|
||||||
MTK_N3D_EXIF_DBGINFO_DATA,
|
|
||||||
//
|
|
||||||
MTK_POSTNR_EXIF_DBGINFO_NR_KEY,
|
|
||||||
MTK_POSTNR_EXIF_DBGINFO_NR_DATA,
|
|
||||||
//
|
|
||||||
MTK_RESVB_EXIF_DBGINFO_KEY,
|
|
||||||
MTK_RESVB_EXIF_DBGINFO_DATA,
|
|
||||||
//
|
|
||||||
MTK_RESVC_EXIF_DBGINFO_KEY,
|
|
||||||
MTK_RESVC_EXIF_DBGINFO_DATA,
|
|
||||||
// data: Memory
|
|
||||||
MTK_3A_EXIF_DEBUGINFO_END, // debug info end
|
|
||||||
} mtk_platform_3a_exif_metadata_tag_t;
|
|
||||||
|
|
||||||
// MTK_3A_FEATURE_AE_EXPOSURE_LEVEL
|
|
||||||
typedef enum mtk_camera_metadata_enum_ae_exposure_level {
|
|
||||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_NONE = 0,
|
|
||||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_SHORT,
|
|
||||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_NORMAL,
|
|
||||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_LONG,
|
|
||||||
} mtk_camera_metadata_enum_ae_exposure_level_t;
|
|
||||||
|
|
||||||
// MTK_3A_FEATURE_AE_TARGET_MODE
|
|
||||||
typedef enum mtk_camera_metadata_enum_ae_target_mode {
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_NORMAL = 0,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_IVHDR,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_MVHDR,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_ZVHDR,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_LE_FIX,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_SE_FIX,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_4CELL_MVHDR,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_MSTREAM_VHDR,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_MSTREAM_VHDR_RTO1X,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_STAGGER_2EXP,
|
|
||||||
MTK_3A_FEATURE_AE_TARGET_MODE_STAGGER_3EXP,
|
|
||||||
} mtk_camera_metadata_enum_ae_target_mode_t;
|
|
||||||
|
|
||||||
//MTK_3A_FEATURE_AE_VALID_EXPOSURE_NUM
|
|
||||||
typedef enum mtk_camera_metadata_enum_stagger_valid_exposure_num {
|
|
||||||
MTK_STAGGER_VALID_EXPOSURE_NON = 0,
|
|
||||||
MTK_STAGGER_VALID_EXPOSURE_1 = 1,
|
|
||||||
MTK_STAGGER_VALID_EXPOSURE_2 = 2,
|
|
||||||
MTK_STAGGER_VALID_EXPOSURE_3 = 3
|
|
||||||
} mtk_camera_metadata_enum_stagger_valid_exposure_num_t;
|
|
||||||
|
|
||||||
//MTK_3A_ISP_FUS_NUM
|
|
||||||
typedef enum mtk_camera_metadata_enum_3a_isp_fus_num {
|
|
||||||
MTK_3A_ISP_FUS_NUM_NON = 0,
|
|
||||||
MTK_3A_ISP_FUS_NUM_1 = 1,
|
|
||||||
MTK_3A_ISP_FUS_NUM_2 = 2,
|
|
||||||
MTK_3A_ISP_FUS_NUM_3 = 3,
|
|
||||||
} mtk_camera_metadata_enum_3a_isp_fus_num_t;
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
typedef enum mtk_platform_metadata_enum_nr_mode {
|
|
||||||
MTK_NR_MODE_OFF = 0,
|
|
||||||
MTK_NR_MODE_MNR,
|
|
||||||
MTK_NR_MODE_SWNR,
|
|
||||||
MTK_NR_MODE_AUTO
|
|
||||||
} mtk_platform_metadata_enum_nr_mode_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_mfb_mode {
|
|
||||||
MTK_MFB_MODE_OFF = 0,
|
|
||||||
MTK_MFB_MODE_MFLL,
|
|
||||||
MTK_MFB_MODE_AIS,
|
|
||||||
MTK_MFB_MODE_NUM,
|
|
||||||
} mtk_platform_metadata_enum_mfb_mode_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_custom_hint {
|
|
||||||
MTK_CUSTOM_HINT_0 = 0,
|
|
||||||
MTK_CUSTOM_HINT_1,
|
|
||||||
MTK_CUSTOM_HINT_2,
|
|
||||||
MTK_CUSTOM_HINT_3,
|
|
||||||
MTK_CUSTOM_HINT_4,
|
|
||||||
MTK_CUSTOM_HINT_NUM,
|
|
||||||
} mtk_platform_metadata_enum_custom_hint_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_plugin_mode {
|
|
||||||
MTK_PLUGIN_MODE_COMBINATION = 1 << 0,
|
|
||||||
MTK_PLUGIN_MODE_NR = 1 << 1,
|
|
||||||
MTK_PLUGIN_MODE_HDR = 1 << 2,
|
|
||||||
MTK_PLUGIN_MODE_MFNR = 1 << 3,
|
|
||||||
MTK_PLUGIN_MODE_COPY = 1 << 4,
|
|
||||||
MTK_PLUGIN_MODE_TEST_PRV = 1 << 5,
|
|
||||||
MTK_PLUGIN_MODE_BMDN = 1 << 6,
|
|
||||||
MTK_PLUGIN_MODE_MFHR = 1 << 7,
|
|
||||||
MTK_PLUGIN_MODE_BMDN_3rdParty = 1 << 8,
|
|
||||||
MTK_PLUGIN_MODE_MFHR_3rdParty = 1 << 9,
|
|
||||||
MTK_PLUGIN_MODE_FUSION_3rdParty = 1 << 10,
|
|
||||||
MTK_PLUGIN_MODE_VSDOF_3rdParty = 1 << 11,
|
|
||||||
MTK_PLUGIN_MODE_COLLECT = 1 << 12,
|
|
||||||
MTK_PLUGIN_MODE_HDR_3RD_PARTY = 1 << 13,
|
|
||||||
MTK_PLUGIN_MODE_MFNR_3RD_PARTY = 1 << 14,
|
|
||||||
MTK_PLUGIN_MODE_BOKEH_3RD_PARTY = 1 << 15,
|
|
||||||
MTK_PLUGIN_MODE_DCMF_3RD_PARTY = 1 << 16,
|
|
||||||
} mtk_platform_metadata_enum_plugin_mode_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_p2_plugin_combination {
|
|
||||||
MTK_P2_RAW_PROCESSOR = 1 << 0,
|
|
||||||
MTK_P2_ISP_PROCESSOR = 1 << 1,
|
|
||||||
MTK_P2_YUV_PROCESSOR = 1 << 2,
|
|
||||||
MTK_P2_MDP_PROCESSOR = 1 << 3,
|
|
||||||
MTK_P2_CAPTURE_REQUEST = 1 << 4,
|
|
||||||
MTK_P2_PREVIEW_REQUEST = 1 << 5
|
|
||||||
} mtk_platform_metadata_enum_p2_plugin_combination;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_isp_color_space {
|
|
||||||
MTK_ISP_COLOR_SPACE_SRGB = 0 ,
|
|
||||||
MTK_ISP_COLOR_SPACE_DISPLAY_P3 = 1 ,
|
|
||||||
MTK_ISP_COLOR_SPACE_CUSTOM_1 = 2
|
|
||||||
} mtk_platform_metadata_enum_isp_color_space;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_dualzoom_drop_req {
|
|
||||||
MTK_DUALZOOM_DROP_NEVER_DROP = 0,
|
|
||||||
MTK_DUALZOOM_DROP_NONE = 1,
|
|
||||||
MTK_DUALZOOM_DROP_DIRECTLY = 2,
|
|
||||||
MTK_DUALZOOM_DROP_NEED_P1,
|
|
||||||
MTK_DUALZOOM_DROP_NEED_SYNCMGR,
|
|
||||||
MTK_DUALZOOM_DROP_NEED_SYNCMGR_NEED_STREAM_F_PIPE,
|
|
||||||
} mtk_platform_metadata_enum_dualzoom_drop_req_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_p1_sensor_status {
|
|
||||||
MTK_P1_SENSOR_STATUS_NONE = 0,
|
|
||||||
MTK_P1_SENSOR_STATUS_STREAMING = 1,
|
|
||||||
MTK_P1_SENSOR_STATUS_SW_STANDBY = 2,
|
|
||||||
MTK_P1_SENSOR_STATUS_HW_STANDBY = 3,
|
|
||||||
} mtk_platform_metadata_enum_p1_sensor_status_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_p1_twin_switch {
|
|
||||||
MTK_P1_TWIN_SWITCH_NONE = 0,
|
|
||||||
MTK_P1_TWIN_SWITCH_ONE_TG = 1,
|
|
||||||
MTK_P1_TWIN_SWITCH_TWO_TG = 2
|
|
||||||
} mtk_platform_metadata_enum_p1_twin_switch_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_p1_twin_status {
|
|
||||||
MTK_P1_TWIN_STATUS_NONE = 0,
|
|
||||||
MTK_P1_TWIN_STATUS_TG_MODE_1 = 1,
|
|
||||||
MTK_P1_TWIN_STATUS_TG_MODE_2 = 2,
|
|
||||||
MTK_P1_TWIN_STATUS_TG_MODE_3 = 3,
|
|
||||||
} mtk_platform_metadata_enum_p1_twin_status_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_p1_resize_quality_switch {
|
|
||||||
MTK_P1_RESIZE_QUALITY_SWITCH_NONE = 0,
|
|
||||||
MTK_P1_RESIZE_QUALITY_SWITCH_L_L = 1,
|
|
||||||
MTK_P1_RESIZE_QUALITY_SWITCH_L_H = 2,
|
|
||||||
MTK_P1_RESIZE_QUALITY_SWITCH_H_L = 3,
|
|
||||||
MTK_P1_RESIZE_QUALITY_SWITCH_H_H = 4,
|
|
||||||
} mtk_platform_metadata_enum_p1_resize_quality_switch_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_p1_resize_quality_status {
|
|
||||||
MTK_P1_RESIZE_QUALITY_STATUS_NONE = 0,
|
|
||||||
MTK_P1_RESIZE_QUALITY_STATUS_ACCEPT = 1,
|
|
||||||
MTK_P1_RESIZE_QUALITY_STATUS_IGNORE = 2,
|
|
||||||
MTK_P1_RESIZE_QUALITY_STATUS_REJECT = 3,
|
|
||||||
MTK_P1_RESIZE_QUALITY_STATUS_ILLEGAL = 4,
|
|
||||||
} mtk_platform_metadata_enum_p1_resize_quality_status_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_p1_resize_quality_level {
|
|
||||||
MTK_P1_RESIZE_QUALITY_LEVEL_UNKNOWN = 0,
|
|
||||||
MTK_P1_RESIZE_QUALITY_LEVEL_L = 1,
|
|
||||||
MTK_P1_RESIZE_QUALITY_LEVEL_H = 2,
|
|
||||||
} mtk_platform_metadata_enum_p1_resize_quality_level_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_lmv_result {
|
|
||||||
MTK_LMV_RESULT_OK = 0,
|
|
||||||
MTK_LMV_RESULT_FAILED,
|
|
||||||
MTK_LMV_RESULT_SWITCHING
|
|
||||||
} mtk_platform_metadata_enum_lmv_result_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_featurepipe_app_mode {
|
|
||||||
MTK_FEATUREPIPE_PHOTO_PREVIEW = 0,
|
|
||||||
MTK_FEATUREPIPE_VIDEO_PREVIEW = 1,
|
|
||||||
MTK_FEATUREPIPE_VIDEO_RECORD = 2,
|
|
||||||
MTK_FEATUREPIPE_VIDEO_STOP = 3,
|
|
||||||
} mtk_platform_metadata_enum_featurepipe_app_mode_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_dcmf_feature_mode {
|
|
||||||
MTK_DCMF_FEATURE_BOKEH = 0,
|
|
||||||
MTK_DCMF_FEATURE_MFNR_BOKEH = 1,
|
|
||||||
MTK_DCMF_FEATURE_HDR_BOKEH = 2,
|
|
||||||
} mtk_platform_metadata_enum_dcmf_feature_mode_t;
|
|
||||||
|
|
||||||
typedef enum mtk_platform_metadata_enum_smvr_fps {
|
|
||||||
MTK_SMVR_FPS_30 = 0,
|
|
||||||
MTK_SMVR_FPS_120 = 1,
|
|
||||||
MTK_SMVR_FPS_240 = 2,
|
|
||||||
MTK_SMVR_FPS_480 = 3,
|
|
||||||
MTK_SMVR_FPS_960 = 4,
|
|
||||||
} mtk_platform_metadata_enum_smvr_fps_t;
|
|
||||||
|
|
||||||
//MTK_FRAMESYNC_FAILHANDLE
|
|
||||||
typedef enum mtk_platform_metadata_enum_fremesync_failhandle {
|
|
||||||
MTK_FRAMESYNC_FAILHANDLE_CONTINUE,
|
|
||||||
MTK_FRAMESYNC_FAILHANDLE_DROP,
|
|
||||||
} mtk_platform_metadata_enum_fremesync_failhandle_t;
|
|
||||||
|
|
||||||
//MTK_FRAMESYNC_RESULT
|
|
||||||
typedef enum mtk_platform_metadata_enum_fremesync_result {
|
|
||||||
MTK_FRAMESYNC_RESULT_PASS,
|
|
||||||
MTK_FRAMESYNC_RESULT_FAIL_CONTINUE,
|
|
||||||
MTK_FRAMESYNC_RESULT_FAIL_DROP,
|
|
||||||
} mtk_platform_metadata_enum_fremesync_result_t;
|
|
||||||
|
|
||||||
//MTK_FRAMESYNC_MODE
|
|
||||||
typedef enum mtk_platform_metadata_enum_fremesync_mode {
|
|
||||||
MTK_FRAMESYNC_MODE_VSYNC_ALIGNMENT,
|
|
||||||
MTK_FRAMESYNC_MODE_READOUT_CENTER_ALIGNMENT,
|
|
||||||
} mtk_platform_metadata_enum_fremesync_mode_t;
|
|
||||||
|
|
||||||
//MTK_FEATURE_MULTIFRAMENODE_BYPASSED
|
|
||||||
typedef enum mtk_platform_metadata_enum_multiframenode_bypassed {
|
|
||||||
MTK_FEATURE_MULTIFRAMENODE_NOT_BYPASSED = 0,
|
|
||||||
MTK_FEATURE_MULTIFRAMENODE_TO_BE_BYPASSED = 1
|
|
||||||
} mtk_platform_metadata_enum_mfllnode_bypassed_t;
|
|
||||||
|
|
||||||
//MTK_FEATURE_BSS_PROCESS
|
|
||||||
typedef enum mtk_platform_metadata_enum_bss_processing {
|
|
||||||
MTK_FEATURE_BSS_PROCESS_ENABLE = 0,
|
|
||||||
MTK_FEATURE_BSS_PROCESS_DISABLE = 1
|
|
||||||
} mtk_platform_metadata_enum_bss_processing_t;
|
|
||||||
|
|
||||||
//MTK_FEATURE_BSS_MANUAL_ORDER
|
|
||||||
typedef enum mtk_platform_metadata_enum_bss_manual_order {
|
|
||||||
MTK_FEATURE_BSS_MANUAL_ORDER_OFF = 0,
|
|
||||||
MTK_FEATURE_BSS_MANUAL_ORDER_GOLDEN = 1
|
|
||||||
} mtk_platform_metadata_enum_bss_manual_order_t;
|
|
||||||
|
|
||||||
//MTK_FEATURE_CAP_YUV_PROCESSING
|
|
||||||
typedef enum mtk_platform_metadata_enum_cap_yuv_processing {
|
|
||||||
MTK_FEATURE_CAP_YUV_PROCESSING_NOT_NEEDED = 0,
|
|
||||||
MTK_FEATURE_CAP_YUV_PROCESSING_NEEDED = 1
|
|
||||||
} mtk_platform_metadata_enum_cap_yuv_processing_t;
|
|
||||||
|
|
||||||
//MTK_FEATURE_CAP_PIPE_DCE_CONTROL
|
|
||||||
typedef enum mtk_platform_metadata_enum_cap_pipe_control {
|
|
||||||
MTK_FEATURE_CAP_PIPE_DCE_ENABLE_BUT_NOT_APPLY = 2,
|
|
||||||
MTK_FEATURE_CAP_PIPE_DCE_MANUAL_DISABLE = 1,
|
|
||||||
MTK_FEATURE_CAP_PIPE_DCE_DEFAULT_APPLY = 0
|
|
||||||
} mtk_platform_metadata_enum_cap_pipe_dce_control_t;
|
|
||||||
|
|
||||||
// MTK_FEATURE_AINR_MDLA_MODE, MTK_ISP_AINR_MDLA_MODE
|
|
||||||
typedef enum mtk_platform_metadata_enum_ainr_mdla_mode {
|
|
||||||
MTK_FEATURE_AINR_MDLA_MODE_NONE = 0,
|
|
||||||
MTK_FEATURE_AINR_MDLA_MODE_DRCOUT_16BIT = 1,
|
|
||||||
MTK_FEATURE_AINR_MDLA_MODE_NNOUT_12BIT = 2,
|
|
||||||
MTK_FEATURE_AINR_MDLA_MODE_NNOUT_16BIT = 3,
|
|
||||||
} mtk_platform_metadata_enum_ainr_mdla_mode_t;
|
|
||||||
|
|
||||||
//MTK_ISP_P2_PROCESSED_RAW
|
|
||||||
typedef enum mtk_platform_metadata_enum_p2_processed_raw {
|
|
||||||
MTK_ISP_P2_PROCESSED_RAW_NOT_NEEDED = 0,
|
|
||||||
MTK_ISP_P2_PROCESSED_RAW_NEEDED = 1
|
|
||||||
} mtk_platform_metadata_enum_p2_processed_raw_t;
|
|
||||||
|
|
||||||
//MTK_DUALZOOM_STREAMING_NR
|
|
||||||
typedef enum mtk_platform_metadata_enum_dualzoom_streaming_nr {
|
|
||||||
MTK_DUALZOOM_STREAMING_NR_AUTO = 0,
|
|
||||||
MTK_DUALZOOM_STREAMING_NR_OFF = 1
|
|
||||||
} mtk_platform_metadata_enum_dualzoom_streaming_nr_t;
|
|
||||||
|
|
||||||
//MTK_STAGGER_BLOB_IMGO_ORDER
|
|
||||||
typedef enum mtk_platform_metadata_enum_stagger_blob_imgo_order {
|
|
||||||
MTK_STAGGER_IMGO_NONE = 0,
|
|
||||||
MTK_STAGGER_IMGO_NE = 1,
|
|
||||||
MTK_STAGGER_IMGO_ME = 2,
|
|
||||||
MTK_STAGGER_IMGO_SE = 3
|
|
||||||
} mtk_platform_metadata_enum_stagger_blob_imgo_order_t;
|
|
||||||
|
|
||||||
//MTK_3A_EXIF_FLASH_FIRING_STATUS
|
|
||||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_firing_status_t {
|
|
||||||
MTK_3A_EXIF_FLASH_FIRING_STATUS_NOT_FIRED = 0,
|
|
||||||
MTK_3A_EXIF_FLASH_FIRING_STATUS_FIRED = 1,
|
|
||||||
} mtk_platform_metadata_enum_3a_exif_flash_firing_status_t;
|
|
||||||
|
|
||||||
//MTK_3A_EXIF_FLASH_RETURN_DETECTION
|
|
||||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_return_detection_t {
|
|
||||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION_NOT_SUPPORT = 0,
|
|
||||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION_RESERVED = 1,
|
|
||||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION_STROBE_NOT_DETECTED = 2,
|
|
||||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION_STROBE_DETECTED = 3,
|
|
||||||
} mtk_platform_metadata_enum_3a_exif_flash_return_detection_t;
|
|
||||||
|
|
||||||
//MTK_3A_EXIF_FLASH_MODE
|
|
||||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_mode_t {
|
|
||||||
MTK_3A_EXIF_FLASH_MODE_UNKNOWN = 0,
|
|
||||||
MTK_3A_EXIF_FLASH_MODE_COMPULSORY_FIRING = 1,
|
|
||||||
MTK_3A_EXIF_FLASH_MODE_COMPULSORY_SUPPRESSION = 2,
|
|
||||||
MTK_3A_EXIF_FLASH_MODE_AUTO = 3,
|
|
||||||
} mtk_platform_metadata_enum_3a_exif_flash_mode_t;
|
|
||||||
|
|
||||||
//MTK_3A_EXIF_FLASH_FUNCTION
|
|
||||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_function_t {
|
|
||||||
MTK_3A_EXIF_FLASH_FUNCTION_SUPPORT = 0,
|
|
||||||
MTK_3A_EXIF_FLASH_FUNCTION_NOT_SUPPORT = 1,
|
|
||||||
} mtk_platform_metadata_enum_3a_exif_flash_function_t;
|
|
||||||
|
|
||||||
//MTK_3A_EXIF_FLASH_REDEYE
|
|
||||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_redeye_t {
|
|
||||||
MTK_3A_EXIF_FLASH_REDEYE_NOT_SUPPORT = 0,
|
|
||||||
MTK_3A_EXIF_FLASH_REDEYE_SUPPORT = 1,
|
|
||||||
} mtk_platform_metadata_enum_3a_exif_flash_redeye_t;
|
|
||||||
|
|
||||||
//MTK_FEATURE_ABF
|
|
||||||
typedef enum mtk_platform_metadata_enum_abf_mode {
|
|
||||||
MTK_ABF_MODE_OFF = 0,
|
|
||||||
MTK_ABF_MODE_ON,
|
|
||||||
} mtk_platform_metadata_enum_abf_mode_t;
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
@ -1,547 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Matthew on 2025/3/11.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "Streaming.h"
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
#include <thread>
|
|
||||||
#include <atomic>
|
|
||||||
|
|
||||||
#include <android/api-level.h>
|
|
||||||
#include <android/log.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include <libavformat/avformat.h>
|
|
||||||
#include <libavcodec/avcodec.h>
|
|
||||||
#include <libavutil/avutil.h>
|
|
||||||
#include <libavutil/opt.h>
|
|
||||||
#include <libavutil/time.h>
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void ffmpeg_log_callback(void *ptr, int level, const char *fmt, va_list vl);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
StreamForwarder::~StreamForwarder() {
|
|
||||||
stop();
|
|
||||||
if (inputCtx) {
|
|
||||||
avformat_close_input(&inputCtx);
|
|
||||||
}
|
|
||||||
if (outputCtx) {
|
|
||||||
if (outputCtx->pb) {
|
|
||||||
avio_closep(&outputCtx->pb);
|
|
||||||
}
|
|
||||||
avformat_free_context(outputCtx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool StreamForwarder::initialize(const std::string& inputUrl, const std::string& outputUrl) {
|
|
||||||
if (!openInput(inputUrl)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!openOutput(outputUrl)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool StreamForwarder::openInput(const std::string& inputUrl) {
|
|
||||||
inputCtx = avformat_alloc_context();
|
|
||||||
if (!inputCtx) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (avformat_open_input(&inputCtx, inputUrl.c_str(), nullptr, nullptr) < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (avformat_find_stream_info(inputCtx, nullptr) < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool StreamForwarder::openOutput(const std::string& outputUrl) {
|
|
||||||
int ret = avformat_alloc_output_context2(&outputCtx, nullptr, "flv", outputUrl.c_str());
|
|
||||||
if (ret < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy streams from input to output
|
|
||||||
for (unsigned int i = 0; i < inputCtx->nb_streams; i++) {
|
|
||||||
AVStream* inStream = inputCtx->streams[i];
|
|
||||||
AVStream* outStream = avformat_new_stream(outputCtx, inStream->codec->codec);
|
|
||||||
if (!outStream) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = avcodec_copy_context(outStream->codec, inStream->codec);
|
|
||||||
if (ret < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open output file
|
|
||||||
if (!(outputCtx->oformat->flags & AVFMT_NOFILE)) {
|
|
||||||
ret = avio_open(&outputCtx->pb, outputUrl.c_str(), AVIO_FLAG_WRITE);
|
|
||||||
if (ret < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write header
|
|
||||||
ret = avformat_write_header(outputCtx, nullptr);
|
|
||||||
if (ret < 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StreamForwarder::setFrameCallback(std::function<void(uint8_t*, int, int, int)> callback) {
|
|
||||||
frameCallback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StreamForwarder::start() {
|
|
||||||
isRunning = true;
|
|
||||||
forwardPackets();
|
|
||||||
}
|
|
||||||
|
|
||||||
void StreamForwarder::stop() {
|
|
||||||
isRunning = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StreamForwarder::forwardPackets() {
|
|
||||||
AVPacket packet;
|
|
||||||
AVFrame* frame = av_frame_alloc();
|
|
||||||
|
|
||||||
while (isRunning) {
|
|
||||||
if (av_read_frame(inputCtx, &packet) < 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process video frames if callback is set
|
|
||||||
if (frameCallback && packet.stream_index == 0) { // Assuming video is stream 0
|
|
||||||
AVCodecContext* codecCtx = inputCtx->streams[packet.stream_index]->codec;
|
|
||||||
int ret = avcodec_send_packet(codecCtx, &packet);
|
|
||||||
if (ret < 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (ret >= 0) {
|
|
||||||
ret = avcodec_receive_frame(codecCtx, frame);
|
|
||||||
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
|
||||||
break;
|
|
||||||
} else if (ret < 0) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
processFrame(frame);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forward packet
|
|
||||||
av_packet_rescale_ts(&packet,
|
|
||||||
inputCtx->streams[packet.stream_index]->time_base,
|
|
||||||
outputCtx->streams[packet.stream_index]->time_base);
|
|
||||||
|
|
||||||
int ret = av_interleaved_write_frame(outputCtx, &packet);
|
|
||||||
if (ret < 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_packet_unref(&packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
|
||||||
av_frame_free(&frame);
|
|
||||||
av_write_trailer(outputCtx);
|
|
||||||
}
|
|
||||||
|
|
||||||
void StreamForwarder::processFrame(AVFrame* frame) {
|
|
||||||
if (frameCallback) {
|
|
||||||
frameCallback(frame->data[0], frame->linesize[0],
|
|
||||||
frame->width, frame->height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
RtspForwarder::RtspForwarder(const std::string& input, const std::string& output)
|
|
||||||
: inputUrl(input), outputUrl(output), isRunning(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RtspForwarder::isStreaming() const
|
|
||||||
{
|
|
||||||
return isRunning;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RtspForwarder::start()
|
|
||||||
{
|
|
||||||
run();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RtspForwarder::stop()
|
|
||||||
{
|
|
||||||
isRunning = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int RtspForwarder::run()
|
|
||||||
{
|
|
||||||
#ifndef NDEBUG
|
|
||||||
|
|
||||||
// Set the custom log callback
|
|
||||||
av_log_set_callback(ffmpeg_log_callback);
|
|
||||||
av_log_set_level(AV_LOG_DEBUG);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
isRunning = true;
|
|
||||||
AVFormatContext* inputFormatContext = nullptr;
|
|
||||||
AVFormatContext* outputFormatContext = nullptr;
|
|
||||||
int ret;
|
|
||||||
int videoStreamIndex = -1;
|
|
||||||
int64_t startTime = AV_NOPTS_VALUE;
|
|
||||||
AVBSFContext* bsf_ctx = nullptr;
|
|
||||||
|
|
||||||
std::string url = inputUrl;
|
|
||||||
if (!m_userName.empty())
|
|
||||||
{
|
|
||||||
char auth[512] = { 0 };
|
|
||||||
snprintf(auth, sizeof(auth), "%s:%s@", m_userName.c_str(), m_password.c_str());
|
|
||||||
|
|
||||||
url.insert(url.begin() + 7, auth, auth + strlen(auth));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Input options
|
|
||||||
AVDictionary* inputOptions = nullptr;
|
|
||||||
av_dict_set(&inputOptions, "rtsp_transport", "tcp", 0);
|
|
||||||
av_dict_set(&inputOptions, "stimeout", "5000000", 0); // 5 second timeout
|
|
||||||
// av_dict_set(&inputOptions, "buffer_size", "1024000", 0); // 1MB buffer
|
|
||||||
|
|
||||||
std::cout << "Opening input: " << url << std::endl;
|
|
||||||
|
|
||||||
// Open input
|
|
||||||
ret = avformat_open_input(&inputFormatContext, url.c_str(), nullptr, &inputOptions);
|
|
||||||
av_dict_free(&inputOptions);
|
|
||||||
if (ret < 0) {
|
|
||||||
std::cerr << "Could not open input: " << av_err2str(ret) << std::endl;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get stream info
|
|
||||||
ret = avformat_find_stream_info(inputFormatContext, nullptr);
|
|
||||||
if (ret < 0) {
|
|
||||||
// std::cerr << "Failed to get stream info: " << av_err2str(ret) << std::endl;
|
|
||||||
avformat_close_input(&inputFormatContext);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find video stream
|
|
||||||
for (unsigned i = 0; i < inputFormatContext->nb_streams; i++) {
|
|
||||||
if (inputFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
|
|
||||||
videoStreamIndex = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (videoStreamIndex == -1) {
|
|
||||||
// std::cerr << "No video stream found" << std::endl;
|
|
||||||
avformat_close_input(&inputFormatContext);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create stream mapping
|
|
||||||
std::vector<int> streamMapping(inputFormatContext->nb_streams, -1);
|
|
||||||
int outputStreamIdx = 0;
|
|
||||||
|
|
||||||
|
|
||||||
// Allocate output context
|
|
||||||
ret = avformat_alloc_output_context2(&outputFormatContext, nullptr, "rtsp", outputUrl.c_str());
|
|
||||||
if ((ret < 0) || !outputFormatContext) {
|
|
||||||
std::cerr << "Could not create output context" << std::endl;
|
|
||||||
avformat_close_input(&inputFormatContext);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXED VERSION - remove the redundant stream creation
|
|
||||||
for (unsigned i = 0; i < inputFormatContext->nb_streams; i++) {
|
|
||||||
AVStream* inStream = inputFormatContext->streams[i];
|
|
||||||
const AVCodecParameters *in_codecpar = inStream->codecpar;
|
|
||||||
|
|
||||||
// Skip non-video streams if needed
|
|
||||||
if (in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO) {
|
|
||||||
streamMapping[i] = -1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create only ONE stream per input stream
|
|
||||||
const AVCodec *codec = avcodec_find_decoder(in_codecpar->codec_id);
|
|
||||||
AVStream *outStream = avformat_new_stream(outputFormatContext, codec);
|
|
||||||
if (!outStream) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = avcodec_parameters_copy(outStream->codecpar, in_codecpar);
|
|
||||||
outStream->codecpar->codec_tag = 0;
|
|
||||||
outStream->time_base = (AVRational){1, 90000};
|
|
||||||
outStream->avg_frame_rate = inStream->avg_frame_rate;
|
|
||||||
|
|
||||||
// Map input stream to output stream
|
|
||||||
streamMapping[i] = outputStreamIdx++;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AVBitStreamFilter* filter = av_bsf_get_by_name("h264_mp4toannexb");
|
|
||||||
if (filter)
|
|
||||||
{
|
|
||||||
for (unsigned i = 0; i < outputFormatContext->nb_streams; i++) {
|
|
||||||
AVStream* stream = outputFormatContext->streams[i];
|
|
||||||
if (stream->codecpar->codec_id == AV_CODEC_ID_H264) {
|
|
||||||
ret = av_bsf_alloc(filter, &bsf_ctx);
|
|
||||||
if (ret < 0) {
|
|
||||||
std::cerr << "Failed to allocate bitstream filter context: " << av_err2str(ret) << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy parameters from input to bsf
|
|
||||||
ret = avcodec_parameters_copy(bsf_ctx->par_in, stream->codecpar);
|
|
||||||
if (ret < 0) {
|
|
||||||
std::cerr << "Failed to copy parameters to bsf: " << av_err2str(ret) << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the bsf context
|
|
||||||
ret = av_bsf_init(bsf_ctx);
|
|
||||||
if (ret < 0) {
|
|
||||||
std::cerr << "Failed to initialize bitstream filter: " << av_err2str(ret) << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update output parameters
|
|
||||||
ret = avcodec_parameters_copy(stream->codecpar, bsf_ctx->par_out);
|
|
||||||
if (ret < 0) {
|
|
||||||
std::cerr << "Failed to copy parameters from bsf: " << av_err2str(ret) << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break; // Only apply to the first H.264 stream
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AVDictionary* outputOptions = nullptr;
|
|
||||||
av_dict_set(&outputOptions, "rtsp_transport", "tcp", 0);
|
|
||||||
av_dict_set(&outputOptions, "rtsp_flags", "filter_src", 0);
|
|
||||||
av_dict_set(&outputOptions, "timeout", "5000000", 0);
|
|
||||||
av_dict_set(&outputOptions, "allowed_media_types", "video", 0);
|
|
||||||
av_dict_set(&outputOptions, "buffer_size", "1024000", 0); // 1MB buffer
|
|
||||||
av_dict_set(&outputOptions, "fflags", "nobuffer", 0); // Reduce latency
|
|
||||||
av_dict_set(&outputOptions, "muxdelay", "0.1", 0); // Reduce delay
|
|
||||||
av_dict_set(&outputOptions, "max_delay", "500000", 0);
|
|
||||||
av_dict_set(&outputOptions, "preset", "ultrafast", 0);
|
|
||||||
av_dict_set(&outputOptions, "tune", "zerolatency", 0);
|
|
||||||
av_dict_set(&outputOptions, "rtsp_flags", "prefer_tcp", 0);
|
|
||||||
|
|
||||||
// Open output
|
|
||||||
if (!(outputFormatContext->oformat->flags & AVFMT_NOFILE)) {
|
|
||||||
|
|
||||||
// Output options
|
|
||||||
|
|
||||||
// ret = avio_open(&outputFormatContext->pb, outputUrl.c_str(), AVIO_FLAG_WRITE);
|
|
||||||
ret = avio_open2(&outputFormatContext->pb, outputFormatContext->url, AVIO_FLAG_WRITE, NULL, &outputOptions);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = { 0 };
|
|
||||||
av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
|
||||||
std::cerr << "Could not open output URL: " << errbuf << std::endl;
|
|
||||||
avformat_close_input(&inputFormatContext);
|
|
||||||
avformat_free_context(outputFormatContext);
|
|
||||||
av_dict_free(&outputOptions);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write header
|
|
||||||
ret = avformat_write_header(outputFormatContext, &outputOptions);
|
|
||||||
av_dict_free(&outputOptions);
|
|
||||||
if (ret < 0) {
|
|
||||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = { 0 };
|
|
||||||
av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
|
||||||
std::cerr << "Error writing header: " << errbuf << std::endl;
|
|
||||||
avformat_close_input(&inputFormatContext);
|
|
||||||
if (!(outputFormatContext->oformat->flags & AVFMT_NOFILE))
|
|
||||||
avio_closep(&outputFormatContext->pb);
|
|
||||||
avformat_free_context(outputFormatContext);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Main loop - read and write packets
|
|
||||||
AVPacket packet;
|
|
||||||
AVMediaType medaiType;
|
|
||||||
while (isRunning) {
|
|
||||||
ret = av_read_frame(inputFormatContext, &packet);
|
|
||||||
if (ret < 0) {
|
|
||||||
if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) {
|
|
||||||
std::cerr << "End of stream or timeout, reconnecting in "
|
|
||||||
<< reconnectDelayMs << "ms" << std::endl;
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(reconnectDelayMs));
|
|
||||||
avformat_close_input(&inputFormatContext);
|
|
||||||
ret = avformat_open_input(&inputFormatContext, inputUrl.c_str(), nullptr, &inputOptions);
|
|
||||||
if (ret < 0) continue;
|
|
||||||
ret = avformat_find_stream_info(inputFormatContext, nullptr);
|
|
||||||
if (ret < 0) continue;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Later when writing packets:
|
|
||||||
int original_stream_index = packet.stream_index;
|
|
||||||
if (streamMapping[original_stream_index] >= 0) {
|
|
||||||
packet.stream_index = streamMapping[original_stream_index];
|
|
||||||
// Write packet...
|
|
||||||
} else {
|
|
||||||
// Skip this packet
|
|
||||||
av_packet_unref(&packet);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip audio packets
|
|
||||||
medaiType = inputFormatContext->streams[original_stream_index]->codecpar->codec_type;
|
|
||||||
if (medaiType == AVMEDIA_TYPE_AUDIO || medaiType == AVMEDIA_TYPE_DATA)
|
|
||||||
{
|
|
||||||
av_packet_unref(&packet);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Fix timestamps if enabled
|
|
||||||
if (fixTimestamps) {
|
|
||||||
// Handle timestamp issues similar to FFmpeg warning
|
|
||||||
AVStream* inStream = inputFormatContext->streams[packet.stream_index];
|
|
||||||
AVStream* outStream = outputFormatContext->streams[packet.stream_index];
|
|
||||||
|
|
||||||
if (packet.pts == AV_NOPTS_VALUE) {
|
|
||||||
// Generate PTS if missing
|
|
||||||
if (startTime == AV_NOPTS_VALUE) {
|
|
||||||
startTime = av_gettime();
|
|
||||||
}
|
|
||||||
packet.pts = av_rescale_q(av_gettime() - startTime,
|
|
||||||
AV_TIME_BASE_Q,
|
|
||||||
inStream->time_base);
|
|
||||||
packet.dts = packet.pts;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rescale timestamps to output timebase
|
|
||||||
packet.pts = av_rescale_q_rnd(packet.pts,
|
|
||||||
inStream->time_base,
|
|
||||||
outStream->time_base,
|
|
||||||
static_cast<AVRounding>(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
|
|
||||||
packet.dts = av_rescale_q_rnd(packet.dts,
|
|
||||||
inStream->time_base,
|
|
||||||
outStream->time_base,
|
|
||||||
static_cast<AVRounding>(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
|
|
||||||
packet.duration = av_rescale_q(packet.duration,
|
|
||||||
inStream->time_base,
|
|
||||||
outStream->time_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write packet to output
|
|
||||||
ret = av_interleaved_write_frame(outputFormatContext, &packet);
|
|
||||||
av_packet_unref(&packet);
|
|
||||||
if (ret < 0) {
|
|
||||||
std::cerr << "Error writing frame: " << av_err2str(ret) << std::endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
AVStream *in_stream = inputFormatContext->streams[original_stream_index];
|
|
||||||
AVStream *out_stream = outputFormatContext->streams[packet.stream_index];
|
|
||||||
av_packet_rescale_ts(&packet, in_stream->time_base, out_stream->time_base);
|
|
||||||
|
|
||||||
// CRITICAL: Fix timestamp issues
|
|
||||||
if (packet.dts != AV_NOPTS_VALUE && packet.pts != AV_NOPTS_VALUE && packet.dts > packet.pts) {
|
|
||||||
packet.dts = packet.pts;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle missing timestamps
|
|
||||||
if (packet.pts == AV_NOPTS_VALUE) {
|
|
||||||
if (startTime == AV_NOPTS_VALUE) {
|
|
||||||
startTime = av_gettime();
|
|
||||||
}
|
|
||||||
packet.pts = av_rescale_q(av_gettime() - startTime,
|
|
||||||
AV_TIME_BASE_Q,
|
|
||||||
out_stream->time_base);
|
|
||||||
packet.dts = packet.pts;
|
|
||||||
}
|
|
||||||
|
|
||||||
packet.pos = -1;
|
|
||||||
|
|
||||||
// Apply bitstream filter if it's H.264
|
|
||||||
if (bsf_ctx && out_stream->codecpar->codec_id == AV_CODEC_ID_H264) {
|
|
||||||
ret = av_bsf_send_packet(bsf_ctx, &packet);
|
|
||||||
if (ret < 0) {
|
|
||||||
std::cerr << "Error sending packet to bitstream filter: " << av_err2str(ret) << std::endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (ret >= 0) {
|
|
||||||
ret = av_bsf_receive_packet(bsf_ctx, &packet);
|
|
||||||
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
|
||||||
// Need more input or end of file
|
|
||||||
break;
|
|
||||||
} else if (ret < 0) {
|
|
||||||
std::cerr << "Error receiving packet from bitstream filter: " << av_err2str(ret) << std::endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the filtered packet
|
|
||||||
ret = av_interleaved_write_frame(outputFormatContext, &packet);
|
|
||||||
av_packet_unref(&packet);
|
|
||||||
if (ret < 0) {
|
|
||||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = { 0 };
|
|
||||||
av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
|
||||||
std::cerr << "Error writing frame: " << errbuf << std::endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Write the packet without filtering
|
|
||||||
ret = av_interleaved_write_frame(outputFormatContext, &packet);
|
|
||||||
av_packet_unref(&packet);
|
|
||||||
if (ret < 0) {
|
|
||||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = { 0 };
|
|
||||||
av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
|
||||||
std::cerr << "Error writing frame: " << errbuf << std::endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
// Free the bitstream filter context
|
|
||||||
if (bsf_ctx) {
|
|
||||||
av_bsf_free(&bsf_ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write trailer
|
|
||||||
av_write_trailer(outputFormatContext);
|
|
||||||
|
|
||||||
// Cleanup
|
|
||||||
avformat_close_input(&inputFormatContext);
|
|
||||||
if (outputFormatContext && !(outputFormatContext->oformat->flags & AVFMT_NOFILE))
|
|
||||||
avio_closep(&outputFormatContext->pb);
|
|
||||||
avformat_free_context(outputFormatContext);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Matthew on 2025/3/11.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MICROPHOTO_STREAMING_H
|
|
||||||
#define MICROPHOTO_STREAMING_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <memory>
|
|
||||||
#include <functional>
|
|
||||||
#include <iostream>
|
|
||||||
#include <thread>
|
|
||||||
#include <atomic>
|
|
||||||
|
|
||||||
|
|
||||||
#include <android/multinetwork.h>
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include <libavcodec/avcodec.h>
|
|
||||||
#include <libavformat/avformat.h>
|
|
||||||
#include <libavutil/avutil.h>
|
|
||||||
#include <libswscale/swscale.h>
|
|
||||||
}
|
|
||||||
|
|
||||||
class Streaming
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~Streaming() {}
|
|
||||||
virtual bool start() { return false; }
|
|
||||||
virtual bool stop() { return false; }
|
|
||||||
virtual bool isStreaming() const { return false; }
|
|
||||||
|
|
||||||
void setAuth(const std::string& userName, const std::string& password)
|
|
||||||
{
|
|
||||||
m_userName = userName;
|
|
||||||
m_password = password;
|
|
||||||
}
|
|
||||||
protected:
|
|
||||||
std::string m_userName;
|
|
||||||
std::string m_password;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
class StreamForwarder : public Streaming
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
AVFormatContext* inputCtx = nullptr;
|
|
||||||
AVFormatContext* outputCtx = nullptr;
|
|
||||||
bool isRunning = false;
|
|
||||||
|
|
||||||
public:
|
|
||||||
StreamForwarder() = default;
|
|
||||||
virtual ~StreamForwarder();
|
|
||||||
|
|
||||||
bool initialize(const std::string& inputUrl, const std::string& outputUrl);
|
|
||||||
virtual void start();
|
|
||||||
virtual void stop();
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool openInput(const std::string& inputUrl);
|
|
||||||
bool openOutput(const std::string& outputUrl);
|
|
||||||
void forwardPackets();
|
|
||||||
void setFrameCallback(std::function<void(uint8_t*, int, int, int)> callback);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
class RtspForwarder : public Streaming {
|
|
||||||
private:
|
|
||||||
std::string inputUrl;
|
|
||||||
std::string outputUrl;
|
|
||||||
std::atomic<bool> isRunning;
|
|
||||||
|
|
||||||
// Options
|
|
||||||
int reconnectDelayMs = 5000;
|
|
||||||
bool fixTimestamps = true;
|
|
||||||
|
|
||||||
public:
|
|
||||||
RtspForwarder(const std::string& input, const std::string& output);
|
|
||||||
|
|
||||||
virtual bool start();
|
|
||||||
virtual bool stop();
|
|
||||||
virtual bool isStreaming() const;
|
|
||||||
|
|
||||||
|
|
||||||
int run();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //MICROPHOTO_STREAMING_H
|
|
@ -1,330 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Matthew on 2025/3/4.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "HangYuCtrl.h"
|
|
||||||
#include "netcamera.h"
|
|
||||||
#include "httpclient.h"
|
|
||||||
#include <LogThread.h>
|
|
||||||
|
|
||||||
#include <SpecData_JSON.h>
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
HangYuCtrl::~HangYuCtrl()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY)
|
|
||||||
{
|
|
||||||
//流类型范围1-4,1为主流
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1", m_ip.c_str(), (uint32_t)channel);
|
|
||||||
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
|
|
||||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
|
||||||
if (res != 0 || resData.empty())
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string xmlString(resData.begin(), resData.end());
|
|
||||||
|
|
||||||
size_t widthStart = xmlString.find("<ResolutionWidth>");
|
|
||||||
size_t widthEnd = xmlString.find("</ResolutionWidth>");
|
|
||||||
if (widthStart != std::string::npos && widthEnd != std::string::npos) {
|
|
||||||
widthStart += std::string("<ResolutionWidth>").length();
|
|
||||||
xmlString.replace(widthStart, widthEnd - widthStart, std::to_string(resX));
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t heightStart = xmlString.find("<ResolutionHeigth>");
|
|
||||||
size_t heightEnd = xmlString.find("</ResolutionHeigth>");
|
|
||||||
if (heightStart != std::string::npos && heightEnd != std::string::npos) {
|
|
||||||
heightStart += std::string("<ResolutionHeigth>").length();
|
|
||||||
xmlString.replace(heightStart, heightEnd - heightStart, std::to_string(resY));
|
|
||||||
}
|
|
||||||
|
|
||||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
|
||||||
|
|
||||||
if (res != 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::SetOsd(uint8_t channel, std::string osdstring, uint8_t pos)
|
|
||||||
{
|
|
||||||
// /LAPI/V1.0/Channels/<ID>/Media/OSDs/Contents
|
|
||||||
//左上OSD
|
|
||||||
|
|
||||||
bool hasDateTime = (osdstring.find("$$DATETIME$$") != std::string::npos);
|
|
||||||
size_t posi = osdstring.find("$$DATETIME$$");
|
|
||||||
if (posi != std::string::npos) {
|
|
||||||
size_t endPos = posi + 12;
|
|
||||||
while (endPos < osdstring.size() && (osdstring[endPos] == ' ' || osdstring[endPos] == '\n')) {
|
|
||||||
endPos++;
|
|
||||||
}
|
|
||||||
osdstring.erase(posi, endPos - posi);
|
|
||||||
}
|
|
||||||
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
std::replace(osdstring.begin(), osdstring.end(), '\n', '^');
|
|
||||||
string xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><MultiLineOSD><DisplayTime><Enable>" + string(hasDateTime ? "true" : "false") + "</Enable><PosX>8</PosX><PosY>0</PosY></DisplayTime><OSD><ID>1</ID><Enable>false</Enable><Text>"+ osdstring+ "</Text><x>8</x><y>" + string(hasDateTime ? "24" : "0") + "</y></MultiLineOSD>";
|
|
||||||
int res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HangYuCtrl::EnableOsd(bool enable, uint8_t channel)
|
|
||||||
{
|
|
||||||
//航煜 只能显示时间和一个OSD
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
|
||||||
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
|
|
||||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
|
||||||
if (res != 0 || resData.empty())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string xmlString(resData.begin(), resData.end());
|
|
||||||
|
|
||||||
std::string enableStartTag = "<Enable>";
|
|
||||||
std::string enableEndTag = "</Enable>";
|
|
||||||
|
|
||||||
size_t pos = 0;
|
|
||||||
while ((pos = xmlString.find(enableStartTag, pos)) != std::string::npos) {
|
|
||||||
size_t startPos = pos + enableStartTag.length();
|
|
||||||
size_t endPos = xmlString.find(enableEndTag, startPos);
|
|
||||||
if (endPos == std::string::npos) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
std::string newValue = enable ? "true" : "false";
|
|
||||||
xmlString.replace(startPos, endPos - startPos, newValue);
|
|
||||||
pos = endPos + enableEndTag.length();
|
|
||||||
}
|
|
||||||
|
|
||||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
|
||||||
|
|
||||||
if (res != 0)
|
|
||||||
{
|
|
||||||
// return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string HangYuCtrl::GetStreamingUrl(uint8_t channel)
|
|
||||||
{
|
|
||||||
// /LAPI/V1.0/Channels/<ID>/Media/Video/Streams/<ID>/LiveStreamURL?TransType=<Tran
|
|
||||||
// sType>&TransProtocol=<TransProtocol>
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1/Transport", m_ip.c_str(), (uint32_t)channel);
|
|
||||||
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
|
|
||||||
int res = 0;
|
|
||||||
for (int idx = 0; idx < 10; idx++)
|
|
||||||
{
|
|
||||||
res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
|
||||||
if (res == 0 && !resData.empty())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (res != 0 || resData.empty())
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
resData.push_back(0);
|
|
||||||
const char* start = strstr((const char*)&resData[0], "<RTSPURI>");
|
|
||||||
if (start == NULL)
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
start += 9;
|
|
||||||
const char* end = strstr(start, "</RTSPURI>");
|
|
||||||
if (end == NULL)
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::string(start, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::UpdateTime(time_t ts)
|
|
||||||
{
|
|
||||||
// /LAPI/V1.0/System/Time
|
|
||||||
|
|
||||||
// <?xml version="1.0" encoding="utf-8"?>
|
|
||||||
//<Time>
|
|
||||||
//<DateTimeFormat>
|
|
||||||
//<!--req,string,YYYYMMDDWhhmmss,YYYYMMDDhhmmss,MMDDYYYYWhhmmss,MMD
|
|
||||||
// DYYYYhhmmss,DDMMYYYYWhhmmss,DDMMYYYYhhmmss-->
|
|
||||||
//</DateTimeFormat>
|
|
||||||
//<TimeFormat><!--req,xs:string,12hour,24hour--></TimeFormat>
|
|
||||||
//<SystemTime><!--req,xs:datetime,” 20040503T173008+08”--></SystemTime>
|
|
||||||
//<SyncNTPFlag><!--req,xs:string,"Sync,NoSync"--></SyncNTPFlag>
|
|
||||||
//</Time>
|
|
||||||
|
|
||||||
std::string reqData = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Time><SystemTime>"
|
|
||||||
+ FormatLocalDateTime("%d%02d%02dT%02d%02d%02d") + "+08</SystemTime></Time>";
|
|
||||||
|
|
||||||
std::string url = "http://" + m_ip + "/System/Time";
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
int res = DoPutRequest(url.c_str(), HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, reqData.c_str(), resData);
|
|
||||||
|
|
||||||
if (res != 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::TakePhoto(uint8_t streamID, std::vector<uint8_t>& img)
|
|
||||||
{
|
|
||||||
bool res = false;
|
|
||||||
|
|
||||||
std::vector<uint8_t> data;
|
|
||||||
|
|
||||||
// /Snapshot/%u/1/RemoteImageCaptureV2?ImageFormat=jpg
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Snapshot/%u/1/RemoteImageCaptureV2?ImageFormat=jpg", m_ip.c_str(), (uint32_t)streamID);
|
|
||||||
|
|
||||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, img, &m_lastErrorCode);
|
|
||||||
if (0 == nRet)
|
|
||||||
{
|
|
||||||
bool qualityDowngraded = false;
|
|
||||||
std::string originalConfig;
|
|
||||||
if (img.size() < 1000)
|
|
||||||
{
|
|
||||||
qualityDowngraded = DowngradeQuality(originalConfig);
|
|
||||||
XYLOG(XYLOG_SEVERITY_INFO,"Reduce Img Quality");
|
|
||||||
}
|
|
||||||
nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, img, &m_lastErrorCode);
|
|
||||||
if (!originalConfig.empty())
|
|
||||||
{
|
|
||||||
UpdateQuality(originalConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<uint8_t> header = {0xFF, 0xD8, 0xFF, 0xE0}; // JPEG
|
|
||||||
std::vector<uint8_t>::iterator it = std::search(img.begin(), img.end(), header.begin(), header.end());
|
|
||||||
if (it != img.end() && it != img.begin())
|
|
||||||
{
|
|
||||||
img.erase(img.begin(), it);
|
|
||||||
#ifndef NDEBUG
|
|
||||||
int aa = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nRet == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::DowngradeQuality(std::string& originalConfig)
|
|
||||||
{
|
|
||||||
bool res = false;
|
|
||||||
char url[64] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Snapshot/Config", m_ip.c_str());
|
|
||||||
|
|
||||||
std::vector<uint8_t> data;
|
|
||||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, data);
|
|
||||||
if (0 == nRet)
|
|
||||||
{
|
|
||||||
std::string str = ByteArrayToString(&data[0], data.size());
|
|
||||||
originalConfig = str;
|
|
||||||
if (replaceAll(str, "<Quality>middle</Quality>", "<Quality>low</Quality>") == 0)
|
|
||||||
{
|
|
||||||
res = (replaceAll(str, "<Quality>high</Quality>", "<Quality>middle</Quality>") != 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
res = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!res)
|
|
||||||
{
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
data.clear();
|
|
||||||
if (res)
|
|
||||||
{
|
|
||||||
nRet = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, str.c_str(), data);
|
|
||||||
return 0 == nRet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::UpdateQuality(const std::string& originalConfig)
|
|
||||||
{
|
|
||||||
std::vector<uint8_t> data;
|
|
||||||
char url[64] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Snapshot/Config", m_ip.c_str());
|
|
||||||
int nRet = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, originalConfig.c_str(), data);
|
|
||||||
return 0 == nRet;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::UpgradeQuality()
|
|
||||||
{
|
|
||||||
bool res = false;
|
|
||||||
char url[64] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Snapshot/Config", m_ip.c_str());
|
|
||||||
|
|
||||||
std::vector<uint8_t> data;
|
|
||||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, data);
|
|
||||||
if (0 == nRet)
|
|
||||||
{
|
|
||||||
std::string str = ByteArrayToString(&data[0], data.size());
|
|
||||||
if (replaceAll(str, "<Quality>low</Quality>", "<Quality>middle</Quality>") == 0)
|
|
||||||
{
|
|
||||||
res = (replaceAll(str, "<Quality>middle</Quality>", "<Quality>high</Quality>") != 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
res = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!res)
|
|
||||||
{
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
data.clear();
|
|
||||||
if (res)
|
|
||||||
{
|
|
||||||
nRet = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, str.c_str(), data);
|
|
||||||
return 0 == nRet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::QueryQuality(std::string& qualityContents)
|
|
||||||
{
|
|
||||||
char url[64] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Snapshot/Config", m_ip.c_str());
|
|
||||||
|
|
||||||
std::vector<uint8_t> data;
|
|
||||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, data);
|
|
||||||
if (0 == nRet && !data.empty())
|
|
||||||
{
|
|
||||||
qualityContents = ByteArrayToString(&data[0], data.size());
|
|
||||||
}
|
|
||||||
return (0 == nRet);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HangYuCtrl::TakeVideo(uint8_t streamID, uint32_t duration, std::string path)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Matthew on 2025/3/4.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef __MICROPHOTO_HANGYUCTRL_H__
|
|
||||||
#define __MICROPHOTO_HANGYUCTRL_H__
|
|
||||||
|
|
||||||
#include "VendorCtrl.h"
|
|
||||||
|
|
||||||
class HangYuCtrl : public VendorCtrl
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
using VendorCtrl::VendorCtrl;
|
|
||||||
virtual ~HangYuCtrl();
|
|
||||||
|
|
||||||
virtual bool SetOsd(uint8_t channel, std::string osd, uint8_t pos);
|
|
||||||
virtual void EnableOsd(bool enable, uint8_t channel);
|
|
||||||
virtual std::string GetStreamingUrl(uint8_t channel);
|
|
||||||
virtual bool UpdateTime(time_t ts);
|
|
||||||
virtual bool TakePhoto(uint8_t streamID, std::vector<uint8_t>& img);
|
|
||||||
virtual bool TakeVideo(uint8_t streamID, uint32_t duration, std::string path);
|
|
||||||
virtual bool HasAuthOnStreaming() const { return true; }
|
|
||||||
virtual bool SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool QueryQuality(std::string& qualityContents);
|
|
||||||
bool DowngradeQuality(std::string& originalConfig);
|
|
||||||
bool UpdateQuality(const std::string& originalConfig);
|
|
||||||
bool UpgradeQuality();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__MICROPHOTO_HANGYUCTRL_H__
|
|
@ -1,204 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Matthew on 2025/3/4.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "HikonCtrl.h"
|
|
||||||
#include "netcamera.h"
|
|
||||||
#include "httpclient.h"
|
|
||||||
#include <LogThread.h>
|
|
||||||
|
|
||||||
#include <SpecData_JSON.h>
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
HikonCtrl::~HikonCtrl()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HikonCtrl::SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY)
|
|
||||||
{
|
|
||||||
//流类型范围1-4,1为主流
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1", m_ip.c_str(), (uint32_t)channel);
|
|
||||||
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
|
|
||||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
|
||||||
if (res != 0 || resData.empty())
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string xmlString(resData.begin(), resData.end());
|
|
||||||
|
|
||||||
size_t widthStart = xmlString.find("<ResolutionWidth>");
|
|
||||||
size_t widthEnd = xmlString.find("</ResolutionWidth>");
|
|
||||||
if (widthStart != std::string::npos && widthEnd != std::string::npos) {
|
|
||||||
widthStart += std::string("<ResolutionWidth>").length();
|
|
||||||
xmlString.replace(widthStart, widthEnd - widthStart, std::to_string(resX));
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t heightStart = xmlString.find("<ResolutionHeigth>");
|
|
||||||
size_t heightEnd = xmlString.find("</ResolutionHeigth>");
|
|
||||||
if (heightStart != std::string::npos && heightEnd != std::string::npos) {
|
|
||||||
heightStart += std::string("<ResolutionHeigth>").length();
|
|
||||||
xmlString.replace(heightStart, heightEnd - heightStart, std::to_string(resY));
|
|
||||||
}
|
|
||||||
|
|
||||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
|
||||||
|
|
||||||
if (res != 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HikonCtrl::SetOsd(uint8_t channel, std::string osdstring, uint8_t pos)
|
|
||||||
{
|
|
||||||
// /LAPI/V1.0/Channels/<ID>/Media/OSDs/Contents
|
|
||||||
//左上OSD
|
|
||||||
|
|
||||||
bool hasDateTime = (osdstring.find("$$DATETIME$$") != std::string::npos);
|
|
||||||
size_t posi = osdstring.find("$$DATETIME$$");
|
|
||||||
if (posi != std::string::npos) {
|
|
||||||
size_t endPos = posi + 12;
|
|
||||||
while (endPos < osdstring.size() && (osdstring[endPos] == ' ' || osdstring[endPos] == '\n')) {
|
|
||||||
endPos++;
|
|
||||||
}
|
|
||||||
osdstring.erase(posi, endPos - posi);
|
|
||||||
}
|
|
||||||
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
std::replace(osdstring.begin(), osdstring.end(), '\n', '^');
|
|
||||||
string xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><MultiLineOSD><DisplayTime><Enable>" + string(hasDateTime ? "true" : "false") + "</Enable><PosX>8</PosX><PosY>0</PosY></DisplayTime><OSD><ID>1</ID><Enable>false</Enable><Text>"+ osdstring+ "</Text><x>8</x><y>" + string(hasDateTime ? "24" : "0") + "</y></MultiLineOSD>";
|
|
||||||
int res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HikonCtrl::EnableOsd(bool enable, uint8_t channel)
|
|
||||||
{
|
|
||||||
//航煜 只能显示时间和一个OSD
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
|
||||||
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
|
|
||||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
|
||||||
if (res != 0 || resData.empty())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string xmlString(resData.begin(), resData.end());
|
|
||||||
|
|
||||||
std::string enableStartTag = "<Enable>";
|
|
||||||
std::string enableEndTag = "</Enable>";
|
|
||||||
|
|
||||||
size_t pos = 0;
|
|
||||||
while ((pos = xmlString.find(enableStartTag, pos)) != std::string::npos) {
|
|
||||||
size_t startPos = pos + enableStartTag.length();
|
|
||||||
size_t endPos = xmlString.find(enableEndTag, startPos);
|
|
||||||
if (endPos == std::string::npos) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
std::string newValue = enable ? "true" : "false";
|
|
||||||
xmlString.replace(startPos, endPos - startPos, newValue);
|
|
||||||
pos = endPos + enableEndTag.length();
|
|
||||||
}
|
|
||||||
|
|
||||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
|
||||||
|
|
||||||
if (res != 0)
|
|
||||||
{
|
|
||||||
// return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string HikonCtrl::GetStreamingUrl(uint8_t channel)
|
|
||||||
{
|
|
||||||
// /LAPI/V1.0/Channels/<ID>/Media/Video/Streams/<ID>/LiveStreamURL?TransType=<Tran
|
|
||||||
// sType>&TransProtocol=<TransProtocol>
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1/Transport", m_ip.c_str(), (uint32_t)channel);
|
|
||||||
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
|
|
||||||
int res = 0;
|
|
||||||
for (int idx = 0; idx < 10; idx++)
|
|
||||||
{
|
|
||||||
res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
|
||||||
if (res == 0 && !resData.empty())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (res != 0 || resData.empty())
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
resData.push_back(0);
|
|
||||||
const char* start = strstr((const char*)&resData[0], "<RTSPURI>");
|
|
||||||
if (start == NULL)
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
start += 9;
|
|
||||||
const char* end = strstr(start, "</RTSPURI>");
|
|
||||||
if (end == NULL)
|
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::string(start, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HikonCtrl::UpdateTime(time_t ts)
|
|
||||||
{
|
|
||||||
// /LAPI/V1.0/System/Time
|
|
||||||
|
|
||||||
// <?xml version="1.0" encoding="utf-8"?>
|
|
||||||
//<Time>
|
|
||||||
//<DateTimeFormat>
|
|
||||||
//<!--req,string,YYYYMMDDWhhmmss,YYYYMMDDhhmmss,MMDDYYYYWhhmmss,MMD
|
|
||||||
// DYYYYhhmmss,DDMMYYYYWhhmmss,DDMMYYYYhhmmss-->
|
|
||||||
//</DateTimeFormat>
|
|
||||||
//<TimeFormat><!--req,xs:string,12hour,24hour--></TimeFormat>
|
|
||||||
//<SystemTime><!--req,xs:datetime,” 20040503T173008+08”--></SystemTime>
|
|
||||||
//<SyncNTPFlag><!--req,xs:string,"Sync,NoSync"--></SyncNTPFlag>
|
|
||||||
//</Time>
|
|
||||||
|
|
||||||
std::string reqData = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Time><SystemTime>"
|
|
||||||
+ FormatLocalDateTime("%d%02d%02dT%02d%02d%02d") + "+08</SystemTime></Time>";
|
|
||||||
|
|
||||||
std::string url = "http://" + m_ip + "/System/Time";
|
|
||||||
std::vector<uint8_t> resData;
|
|
||||||
int res = DoPutRequest(url.c_str(), HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, reqData.c_str(), resData);
|
|
||||||
|
|
||||||
if (res != 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HikonCtrl::TakePhoto(uint8_t streamID, std::vector<uint8_t>& img)
|
|
||||||
{
|
|
||||||
char url[128] = { 0 };
|
|
||||||
snprintf(url, sizeof(url), "http://%s/ISAPI/Streaming/channels/1/picture?", m_ip.c_str());
|
|
||||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_DIGEST, m_userName.c_str(), m_password.c_str(), m_netHandle, img, &m_lastErrorCode);
|
|
||||||
return nRet == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HikonCtrl::TakeVideo(uint8_t streamID, uint32_t duration, std::string path)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Matthew on 2025/3/4.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef __MICROPHOTO_HIKONCTRL_H__
|
|
||||||
#define __MICROPHOTO_HIKONCTRL_H__
|
|
||||||
|
|
||||||
#include "VendorCtrl.h"
|
|
||||||
|
|
||||||
class HikonCtrl : public VendorCtrl
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
using VendorCtrl::VendorCtrl;
|
|
||||||
virtual ~HikonCtrl();
|
|
||||||
|
|
||||||
virtual bool SetOsd(uint8_t channel, std::string osd, uint8_t pos);
|
|
||||||
virtual void EnableOsd(bool enable, uint8_t channel);
|
|
||||||
virtual std::string GetStreamingUrl(uint8_t channel);
|
|
||||||
virtual bool UpdateTime(time_t ts);
|
|
||||||
virtual bool TakePhoto(uint8_t streamID, std::vector<uint8_t>& img);
|
|
||||||
virtual bool TakeVideo(uint8_t streamID, uint32_t duration, std::string path);
|
|
||||||
virtual bool HasAuthOnStreaming() const { return true; }
|
|
||||||
virtual bool SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool QueryQuality(std::string& qualityContents);
|
|
||||||
bool DowngradeQuality(std::string& originalConfig);
|
|
||||||
bool UpdateQuality(const std::string& originalConfig);
|
|
||||||
bool UpgradeQuality();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__MICROPHOTO_HIKONCTRL_H__
|
|
@ -0,0 +1,222 @@
|
|||||||
|
package com.xypower.mpapp;
|
||||||
|
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
public class FloatingWindow extends Service {
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private WindowManager mWindowManager;
|
||||||
|
private View mView;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
mContext = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
|
||||||
|
|
||||||
|
allAboutLayout(intent);
|
||||||
|
moveView();
|
||||||
|
|
||||||
|
return super.onStartCommand(intent, flags, startId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (mView != null) {
|
||||||
|
mWindowManager.removeView(mView);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
// ex.printStackTrace();
|
||||||
|
Log.e("FW", "Exception " + ex.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowManager.LayoutParams mWindowsParams;
|
||||||
|
private void moveView() {
|
||||||
|
/*
|
||||||
|
DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
|
||||||
|
int width = (int) (metrics.widthPixels * 1f);
|
||||||
|
int height = (int) (metrics.heightPixels * 1f);
|
||||||
|
|
||||||
|
mWindowsParams = new WindowManager.LayoutParams(
|
||||||
|
width,//WindowManager.LayoutParams.WRAP_CONTENT,
|
||||||
|
height,//WindowManager.LayoutParams.WRAP_CONTENT,
|
||||||
|
//WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
|
||||||
|
|
||||||
|
(Build.VERSION.SDK_INT <= 25) ? WindowManager.LayoutParams.TYPE_PHONE : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
|
||||||
|
,
|
||||||
|
|
||||||
|
//WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
|
||||||
|
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
|
||||||
|
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN // Not displaying keyboard on bg activity's EditText
|
||||||
|
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|
||||||
|
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
|
||||||
|
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
|
||||||
|
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
|
||||||
|
//WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, //Not work with EditText on keyboard
|
||||||
|
PixelFormat.TRANSLUCENT);
|
||||||
|
|
||||||
|
|
||||||
|
mWindowsParams.gravity = Gravity.TOP | Gravity.LEFT;
|
||||||
|
//params.x = 0;
|
||||||
|
mWindowsParams.y = 100;
|
||||||
|
mWindowManager.addView(mView, mWindowsParams);
|
||||||
|
|
||||||
|
mView.setOnTouchListener(new View.OnTouchListener() {
|
||||||
|
private int initialX;
|
||||||
|
private int initialY;
|
||||||
|
private float initialTouchX;
|
||||||
|
private float initialTouchY;
|
||||||
|
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
@Override
|
||||||
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
|
if (System.currentTimeMillis() - startTime <= 300) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (isViewInBounds(mView, (int) (event.getRawX()), (int) (event.getRawY()))) {
|
||||||
|
editTextReceiveFocus();
|
||||||
|
} else {
|
||||||
|
editTextDontReceiveFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (event.getAction()) {
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
initialX = mWindowsParams.x;
|
||||||
|
initialY = mWindowsParams.y;
|
||||||
|
initialTouchX = event.getRawX();
|
||||||
|
initialTouchY = event.getRawY();
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
mWindowsParams.x = initialX + (int) (event.getRawX() - initialTouchX);
|
||||||
|
mWindowsParams.y = initialY + (int) (event.getRawY() - initialTouchY);
|
||||||
|
mWindowManager.updateViewLayout(mView, mWindowsParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isViewInBounds(View view, int x, int y) {
|
||||||
|
Rect outRect = new Rect();
|
||||||
|
int[] location = new int[2];
|
||||||
|
view.getDrawingRect(outRect);
|
||||||
|
view.getLocationOnScreen(location);
|
||||||
|
outRect.offset(location[0], location[1]);
|
||||||
|
return outRect.contains(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editTextReceiveFocus() {
|
||||||
|
if (!wasInFocus) {
|
||||||
|
mWindowsParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
|
||||||
|
mWindowManager.updateViewLayout(mView, mWindowsParams);
|
||||||
|
wasInFocus = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editTextDontReceiveFocus() {
|
||||||
|
if (wasInFocus) {
|
||||||
|
mWindowsParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
|
||||||
|
mWindowManager.updateViewLayout(mView, mWindowsParams);
|
||||||
|
wasInFocus = false;
|
||||||
|
hideKeyboard(mContext, edt1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean wasInFocus = true;
|
||||||
|
private EditText edt1;
|
||||||
|
private void allAboutLayout(Intent intent) {
|
||||||
|
|
||||||
|
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
|
mView = layoutInflater.inflate(R.layout.ovelay_window, null);
|
||||||
|
|
||||||
|
edt1 = (EditText) mView.findViewById(R.id.edt1);
|
||||||
|
final TextView tvValue = (TextView) mView.findViewById(R.id.tvValue);
|
||||||
|
Button btnClose = (Button) mView.findViewById(R.id.btnClose);
|
||||||
|
|
||||||
|
edt1.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
mWindowsParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
|
||||||
|
// mWindowsParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
|
||||||
|
mWindowManager.updateViewLayout(mView, mWindowsParams);
|
||||||
|
wasInFocus = true;
|
||||||
|
showSoftKeyboard(v);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
edt1.addTextChangedListener(new TextWatcher() {
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||||
|
tvValue.setText(edt1.getText());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable editable) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
btnClose.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
stopSelf();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void hideKeyboard(Context context, View view) {
|
||||||
|
if (view != null) {
|
||||||
|
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||||
|
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showSoftKeyboard(View view) {
|
||||||
|
if (view.requestFocus()) {
|
||||||
|
InputMethodManager imm = (InputMethodManager)
|
||||||
|
getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||||
|
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,19 +0,0 @@
|
|||||||
package com.xypower.mpapp;
|
|
||||||
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class HeartBeatResponseReceiver extends BroadcastReceiver {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
String action = intent.getAction();
|
|
||||||
if ("com.systemui.ACTION_HEARTBEAT_RESPONSE".equals(action)) {
|
|
||||||
long timestamp = intent.getLongExtra("timestamp", 0);
|
|
||||||
Log.d("MpApp","系统广播监听 timestamp:"+timestamp);
|
|
||||||
MicroPhotoService.infoLog("收到heartbeat广播 timestamp:" + timestamp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,76 @@
|
|||||||
|
package com.xypower.mpapp;
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
public class ScreenActionReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
|
private String TAG = "ScreenActionReceiver";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
|
||||||
|
//LOG
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("Action: " + intent.getAction() + "\n");
|
||||||
|
// sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
|
||||||
|
String log = sb.toString();
|
||||||
|
Log.d(TAG, log);
|
||||||
|
Toast.makeText(context, log, Toast.LENGTH_SHORT).show();
|
||||||
|
|
||||||
|
String action = intent.getAction();
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (Intent.ACTION_SCREEN_ON.equals(action)) {
|
||||||
|
Log.d(TAG, "screen is on...");
|
||||||
|
Toast.makeText(context, "screen ON", Toast.LENGTH_SHORT);
|
||||||
|
|
||||||
|
//Run the locker
|
||||||
|
|
||||||
|
context.startService(new Intent(context, FloatingWindow.class));
|
||||||
|
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
|
||||||
|
Log.d(TAG, "screen is off...");
|
||||||
|
Toast.makeText(context, "screen OFF", Toast.LENGTH_SHORT);
|
||||||
|
|
||||||
|
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {
|
||||||
|
Log.d(TAG, "screen is unlock...");
|
||||||
|
Toast.makeText(context, "screen UNLOCK", Toast.LENGTH_SHORT);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
context.startForegroundService(new Intent(context, FloatingWindow.class));
|
||||||
|
} else {
|
||||||
|
context.startService(new Intent(context, FloatingWindow.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
|
||||||
|
Log.d(TAG, "boot completed...");
|
||||||
|
Toast.makeText(context, "BOOTED..", Toast.LENGTH_SHORT);
|
||||||
|
//Run the locker
|
||||||
|
/* Intent i = new Intent(context, FloatingWindow.class);
|
||||||
|
context.startService(i);
|
||||||
|
|
||||||
|
*/
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
// context.startForegroundService(new Intent(context, FloatingWindow.class));
|
||||||
|
} else {
|
||||||
|
// context.startService(new Intent(context, FloatingWindow.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntentFilter getFilter(){
|
||||||
|
final IntentFilter filter = new IntentFilter();
|
||||||
|
filter.addAction(Intent.ACTION_SCREEN_OFF);
|
||||||
|
filter.addAction(Intent.ACTION_SCREEN_ON);
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,8 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string-array name="networkProtocols">
|
<string-array name="networkProtocols">
|
||||||
<item>0-TCP</item>
|
<item>TCP</item>
|
||||||
<item>1-UDP</item>
|
<item>UDP</item>
|
||||||
<item>10-MQTT</item>
|
|
||||||
</string-array>
|
</string-array>
|
||||||
</resources>
|
</resources>
|
@ -0,0 +1,248 @@
|
|||||||
|
package com.xypower.common;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.wifi.WifiConfiguration;
|
||||||
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Handler;
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
|
import com.android.dx.stock.ProxyBuilder;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationHandler;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
|
||||||
|
public class HotspotManager {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
|
public static class OreoWifiManager {
|
||||||
|
private static final String TAG = OreoWifiManager.class.getSimpleName();
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private WifiManager mWifiManager;
|
||||||
|
private ConnectivityManager mConnectivityManager;
|
||||||
|
|
||||||
|
public OreoWifiManager(Context c) {
|
||||||
|
mContext = c;
|
||||||
|
mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
|
||||||
|
mConnectivityManager = (ConnectivityManager) mContext.getSystemService(ConnectivityManager.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This sets the Wifi SSID and password
|
||||||
|
* Call this before {@code startTethering} if app is a system/privileged app
|
||||||
|
* Requires: android.permission.TETHER_PRIVILEGED which is only granted to system apps
|
||||||
|
*/
|
||||||
|
public void configureHotspot(String name, String password) {
|
||||||
|
WifiConfiguration apConfig = new WifiConfiguration();
|
||||||
|
apConfig.SSID = name;
|
||||||
|
apConfig.preSharedKey = password;
|
||||||
|
apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
|
||||||
|
try {
|
||||||
|
Method setConfigMethod = mWifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);
|
||||||
|
boolean status = (boolean) setConfigMethod.invoke(mWifiManager, apConfig);
|
||||||
|
Log.d(TAG, "setWifiApConfiguration - success? " + status);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "Error in configureHotspot");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks where tethering is on.
|
||||||
|
* This is determined by the getTetheredIfaces() method,
|
||||||
|
* that will return an empty array if not devices are tethered
|
||||||
|
*
|
||||||
|
* @return true if a tethered device is found, false if not found
|
||||||
|
*/
|
||||||
|
/*public boolean isTetherActive() {
|
||||||
|
try {
|
||||||
|
Method method = mConnectivityManager.getClass().getDeclaredMethod("getTetheredIfaces");
|
||||||
|
if (method == null) {
|
||||||
|
Log.e(TAG, "getTetheredIfaces is null");
|
||||||
|
} else {
|
||||||
|
String res[] = (String[]) method.invoke(mConnectivityManager, null);
|
||||||
|
Log.d(TAG, "getTetheredIfaces invoked");
|
||||||
|
Log.d(TAG, Arrays.toString(res));
|
||||||
|
if (res.length > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "Error in getTetheredIfaces");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* This enables tethering using the ssid/password defined in Settings App>Hotspot & tethering
|
||||||
|
* Does not require app to have system/privileged access
|
||||||
|
* Credit: Vishal Sharma - https://stackoverflow.com/a/52219887
|
||||||
|
*/
|
||||||
|
public boolean startTethering(final OnStartTetheringCallback callback) {
|
||||||
|
|
||||||
|
// On Pie if we try to start tethering while it is already on, it will
|
||||||
|
// be disabled. This is needed when startTethering() is called programmatically.
|
||||||
|
/*if (isTetherActive()) {
|
||||||
|
Log.d(TAG, "Tether already active, returning");
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
File outputDir = mContext.getCodeCacheDir();
|
||||||
|
Object proxy;
|
||||||
|
try {
|
||||||
|
proxy = ProxyBuilder.forClass(OnStartTetheringCallbackClass())
|
||||||
|
.dexCache(outputDir).handler(new InvocationHandler() {
|
||||||
|
@Override
|
||||||
|
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||||
|
switch (method.getName()) {
|
||||||
|
case "onTetheringStarted":
|
||||||
|
callback.onTetheringStarted();
|
||||||
|
break;
|
||||||
|
case "onTetheringFailed":
|
||||||
|
callback.onTetheringFailed();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ProxyBuilder.callSuper(proxy, method, args);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}).build();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "Error in enableTethering ProxyBuilder");
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Method method = null;
|
||||||
|
try {
|
||||||
|
method = mConnectivityManager.getClass().getDeclaredMethod("startTethering", int.class, boolean.class, OnStartTetheringCallbackClass(), Handler.class);
|
||||||
|
if (method == null) {
|
||||||
|
Log.e(TAG, "startTetheringMethod is null");
|
||||||
|
} else {
|
||||||
|
method.invoke(mConnectivityManager, ConnectivityManager.TYPE_MOBILE, false, proxy, null);
|
||||||
|
Log.d(TAG, "startTethering invoked");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "Error in enableTethering");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopTethering() {
|
||||||
|
try {
|
||||||
|
Method method = mConnectivityManager.getClass().getDeclaredMethod("stopTethering", int.class);
|
||||||
|
if (method == null) {
|
||||||
|
Log.e(TAG, "stopTetheringMethod is null");
|
||||||
|
} else {
|
||||||
|
method.invoke(mConnectivityManager, ConnectivityManager.TYPE_MOBILE);
|
||||||
|
Log.d(TAG, "stopTethering invoked");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "stopTethering error: " + e.toString());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Class OnStartTetheringCallbackClass() {
|
||||||
|
try {
|
||||||
|
return Class.forName("android.net.ConnectivityManager$OnStartTetheringCallback");
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
Log.e(TAG, "OnStartTetheringCallbackClass error: " + e.toString());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static abstract class OnStartTetheringCallback {
|
||||||
|
/**
|
||||||
|
* Called when tethering has been successfully started.
|
||||||
|
*/
|
||||||
|
public abstract void onTetheringStarted();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when starting tethering failed.
|
||||||
|
*/
|
||||||
|
public abstract void onTetheringFailed();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
|
private static void setHotspotOnPhone(Context mContext, boolean isEnable) {
|
||||||
|
|
||||||
|
OreoWifiManager mTestOreoWifiManager = null;
|
||||||
|
|
||||||
|
if (mTestOreoWifiManager ==null) {
|
||||||
|
mTestOreoWifiManager = new OreoWifiManager(mContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (isEnable){
|
||||||
|
OnStartTetheringCallback callback = new OnStartTetheringCallback() {
|
||||||
|
@Override
|
||||||
|
public void onTetheringStarted() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTetheringFailed() {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
mTestOreoWifiManager.startTethering(callback);
|
||||||
|
}else{
|
||||||
|
mTestOreoWifiManager.stopTethering();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public static void setWiFiApEnable(Context context, boolean isEnable) {
|
||||||
|
ConnectivityManager mConnectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
if (isEnable) {
|
||||||
|
mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI, false, new ConnectivityManager.OnStartTetheringCallback() {
|
||||||
|
@Override
|
||||||
|
public void onTetheringStarted() {
|
||||||
|
Log.d(TAG, "onTetheringStarted");
|
||||||
|
// Don't fire a callback here, instead wait for the next update from wifi.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTetheringFailed() {
|
||||||
|
Log.d(TAG, "onTetheringFailed");
|
||||||
|
// TODO: Show error.
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static void enableHotspot(Context context, boolean isEnable) {
|
||||||
|
// R: Adnroid 11
|
||||||
|
// O: Android 8
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
// Android 11
|
||||||
|
setHotspotOnPhone(context, isEnable);
|
||||||
|
}/* else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
// Android 8
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
@ -1 +0,0 @@
|
|||||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
|
@ -1 +0,0 @@
|
|||||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"cameraType":0,"compensation":0,"customHdr":0,"exposureTime":0,"hdrStep":0,"ldrEnabled":0,"orientation":0,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"quality":80,"recognization":0,"requestTemplate":2,"resolutionCX":5376,"resolutionCY":3024,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
|
@ -1 +0,0 @@
|
|||||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"burstCaptures":4,"cameraType":0,"compensation":0,"customHdr":0,"exposureTime":0,"hdrStep":0,"ldrEnabled":0,"orientation":3,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"quality":80,"recognization":0,"requestTemplate":2,"resolutionCX":1920,"resolutionCY":1080,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":2,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
|
@ -1 +0,0 @@
|
|||||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"cameraType":0,"compensation":0,"customHdr":0,"hdrStep":0,"ldrEnabled":0,"orientation":4,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"recognization":0,"requestTemplate":1,"resolutionCX":3264,"resolutionCY":2448,"sceneMode":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0}
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
|
@ -1 +0,0 @@
|
|||||||
{"bsManufacturer":"\u4e0a\u6d77\u6b23\u5f71\u7535\u529b\u79d1\u6280\u80a1\u4efd\u6709\u9650\u516c\u53f8","channels":3,"encryption":0,"equipName":"\u56fe\u50cf\u5728\u7ebf\u76d1\u6d4b","heartbeat":10,"imgQuality":80,"model":"MSRDT-1-WP","network":0,"networkProtocol":0,"outputDbgInfo":0,"packetBase":1,"packetSize":32768,"port":6891,"postDataPaused":0,"productionDate":1717200000,"protocol":65298,"quality":80,"reportFault":0,"server":"61.169.135.146","timeForKeepingLogs":1296000,"timeForKeepingPhotos":1296000,"upgradePacketBase":1,"workStatusTimes":3}
|
|
@ -1 +0,0 @@
|
|||||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
|
@ -1,100 +0,0 @@
|
|||||||
[{"v":6015, "c":1},
|
|
||||||
{"v":6283, "c":2},
|
|
||||||
{"v":6442, "c":3},
|
|
||||||
{"v":6553, "c":4},
|
|
||||||
{"v":6641, "c":5},
|
|
||||||
{"v":6708, "c":6},
|
|
||||||
{"v":6735, "c":7},
|
|
||||||
{"v":6742, "c":8},
|
|
||||||
{"v":6746, "c":9},
|
|
||||||
{"v":6751, "c":10},
|
|
||||||
{"v":6757, "c":11},
|
|
||||||
{"v":6765, "c":12},
|
|
||||||
{"v":6774, "c":13},
|
|
||||||
{"v":6785, "c":14},
|
|
||||||
{"v":6797, "c":15},
|
|
||||||
{"v":6811, "c":16},
|
|
||||||
{"v":6822, "c":17},
|
|
||||||
{"v":6833, "c":18},
|
|
||||||
{"v":6844, "c":19},
|
|
||||||
{"v":6853, "c":20},
|
|
||||||
{"v":6863, "c":21},
|
|
||||||
{"v":6871, "c":22},
|
|
||||||
{"v":6878, "c":23},
|
|
||||||
{"v":6883, "c":24},
|
|
||||||
{"v":6891, "c":25},
|
|
||||||
{"v":6896, "c":26},
|
|
||||||
{"v":6897, "c":27},
|
|
||||||
{"v":6901, "c":28},
|
|
||||||
{"v":6903, "c":29},
|
|
||||||
{"v":6904, "c":30},
|
|
||||||
{"v":6906, "c":31},
|
|
||||||
{"v":6907, "c":32},
|
|
||||||
{"v":6908, "c":33},
|
|
||||||
{"v":6910, "c":34},
|
|
||||||
{"v":6911, "c":35},
|
|
||||||
{"v":6911, "c":36},
|
|
||||||
{"v":6913, "c":37},
|
|
||||||
{"v":6914, "c":38},
|
|
||||||
{"v":6914, "c":39},
|
|
||||||
{"v":6915, "c":40},
|
|
||||||
{"v":6917, "c":41},
|
|
||||||
{"v":6918, "c":42},
|
|
||||||
{"v":6918, "c":43},
|
|
||||||
{"v":6921, "c":44},
|
|
||||||
{"v":6922, "c":45},
|
|
||||||
{"v":6924, "c":46},
|
|
||||||
{"v":6926, "c":47},
|
|
||||||
{"v":6927, "c":48},
|
|
||||||
{"v":6929, "c":49},
|
|
||||||
{"v":6931, "c":50},
|
|
||||||
{"v":6934, "c":51},
|
|
||||||
{"v":6938, "c":52},
|
|
||||||
{"v":6941, "c":53},
|
|
||||||
{"v":6946, "c":54},
|
|
||||||
{"v":6948, "c":55},
|
|
||||||
{"v":6952, "c":56},
|
|
||||||
{"v":6954, "c":57},
|
|
||||||
{"v":6957, "c":58},
|
|
||||||
{"v":6959, "c":59},
|
|
||||||
{"v":6961, "c":60},
|
|
||||||
{"v":6963, "c":61},
|
|
||||||
{"v":6965, "c":62},
|
|
||||||
{"v":6967, "c":63},
|
|
||||||
{"v":6971, "c":64},
|
|
||||||
{"v":6973, "c":65},
|
|
||||||
{"v":6976, "c":66},
|
|
||||||
{"v":6978, "c":67},
|
|
||||||
{"v":6980, "c":68},
|
|
||||||
{"v":6982, "c":69},
|
|
||||||
{"v":6984, "c":70},
|
|
||||||
{"v":6986, "c":71},
|
|
||||||
{"v":6988, "c":72},
|
|
||||||
{"v":6989, "c":73},
|
|
||||||
{"v":6991, "c":74},
|
|
||||||
{"v":6992, "c":75},
|
|
||||||
{"v":6993, "c":76},
|
|
||||||
{"v":6995, "c":77},
|
|
||||||
{"v":6997, "c":78},
|
|
||||||
{"v":6998, "c":79},
|
|
||||||
{"v":7000, "c":80},
|
|
||||||
{"v":7003, "c":81},
|
|
||||||
{"v":7004, "c":82},
|
|
||||||
{"v":7006, "c":83},
|
|
||||||
{"v":7008, "c":84},
|
|
||||||
{"v":7011, "c":85},
|
|
||||||
{"v":7014, "c":86},
|
|
||||||
{"v":7018, "c":87},
|
|
||||||
{"v":7021, "c":88},
|
|
||||||
{"v":7024, "c":89},
|
|
||||||
{"v":7029, "c":90},
|
|
||||||
{"v":7033, "c":91},
|
|
||||||
{"v":7039, "c":92},
|
|
||||||
{"v":7044, "c":93},
|
|
||||||
{"v":7052, "c":94},
|
|
||||||
{"v":7062, "c":95},
|
|
||||||
{"v":7073, "c":96},
|
|
||||||
{"v":7087, "c":97},
|
|
||||||
{"v":7104, "c":98},
|
|
||||||
{"v":7122, "c":99},
|
|
||||||
{"v":7142, "c":100}]
|
|
@ -1 +0,0 @@
|
|||||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"cameraType":0,"compensation":0,"customHdr":0,"exposureTime":0,"hdrStep":0,"ldrEnabled":0,"orientation":0,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"quality":80,"recognization":0,"requestTemplate":2,"resolutionCX":5376,"resolutionCY":3024,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
|
@ -1 +0,0 @@
|
|||||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"burstCaptures":4,"cameraType":0,"compensation":0,"customHdr":0,"exposureTime":0,"hdrStep":0,"ldrEnabled":0,"orientation":3,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"quality":80,"recognization":0,"requestTemplate":2,"resolutionCX":1920,"resolutionCY":1080,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":2,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
|
@ -1 +0,0 @@
|
|||||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"cameraType":0,"compensation":0,"customHdr":0,"hdrStep":0,"ldrEnabled":0,"orientation":4,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"recognization":0,"requestTemplate":1,"resolutionCX":3264,"resolutionCY":2448,"sceneMode":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0}
|
|
@ -1 +0,0 @@
|
|||||||
{"blobName16":"354","blobName32":"366","blobName8":"output","borderColor":16776960,"enabled":0,"items":[{"enabled":1,"iid":0,"name":"\u6316\u6398\u673a","prob":0.5,"subType":5,"type":1},{"enabled":1,"iid":1,"name":"\u540a\u5854","prob":0.5,"subType":2,"type":1},{"enabled":1,"iid":2,"name":"\u540a\u8f66","prob":0.5,"subType":1,"type":1},{"enabled":1,"iid":3,"name":"\u6c34\u6ce5\u6cf5\u8f66","prob":0.5,"subType":4,"type":1},{"enabled":1,"iid":4,"name":"\u5c71\u706b","prob":0.5,"subType":40,"type":4},{"enabled":1,"iid":5,"name":"\u70df\u96fe","prob":0.5,"subType":41,"type":4},{"enabled":1,"iid":6,"name":"\u63a8\u571f\u673a","prob":0.5,"subType":3,"type":1},{"enabled":1,"iid":7,"name":"\u7ffb\u6597\u8f66","prob":0.5,"subType":10,"type":1},{"enabled":1,"iid":8,"name":"\u5bfc\u7ebf\u5f02\u7269","prob":0.5,"subType":1,"type":3},{"enabled":1,"iid":9,"name":"\u9632\u5c18\u7f51","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":10,"name":"\u538b\u8def\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":11,"name":"\u6405\u62cc\u8f66","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":12,"name":"\u6869\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":13,"name":"\u56f4\u6321","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":14,"name":"\u6c34\u9a6c","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":15,"name":"\u5b89\u5168\u5e3d","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":16,"name":"\u4e95\u76d6\u7f3a\u5931","prob":1.0099999904632568,"subType":2,"type":3}],"textColor":16776960,"thickness":4,"version":"2024-12-30"}
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
|
@ -0,0 +1 @@
|
|||||||
|
{"autoExposure":1,"autoFocus":1,"awbMode":1,"compensation":0,"exposureTime":0,"ldrEnabled":0,"orientation":0,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%% \u7248\u672c:%%V%%\r\n\u4fe1\u53f7:%%SL%% \u7535\u6c60\u7535\u538b:%%BV%% \u7535\u6c60\u7535\u91cf:%%BP%% \u5145\u7535\u7535\u538b:%%CV%%"},"quality":80,"recognization":2,"requestTemplate":2,"resolutionCX":5376,"resolutionCY":3024,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
@ -0,0 +1 @@
|
|||||||
|
{"autoExposure":1,"autoFocus":1,"awbMode":1,"burstCaptures":4,"compensation":0,"exposureTime":0,"ldrEnabled":0,"orientation":3,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%% \u7248\u672c:%%V%%\r\n\u4fe1\u53f7:%%SL%% \u7535\u6c60\u7535\u538b:%%BV%% \u7535\u6c60\u7535\u91cf:%%BP%% \u5145\u7535\u7535\u538b:%%CV%%"},"quality":80,"recognization":2,"requestTemplate":2,"resolutionCX":1920,"resolutionCY":1080,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":2,"usingSysCamera":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
@ -0,0 +1 @@
|
|||||||
|
{"autoExposure":1,"autoFocus":1,"awbMode":1,"compensation":0,"ldrEnabled":0,"orientation":4,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%% \u7248\u672c:%%V%%\r\n\u4fe1\u53f7:%%SL%% \u7535\u6c60\u7535\u538b:%%BV%% \u7535\u6c60\u7535\u91cf:%%BP%% \u5145\u7535\u7535\u538b:%%CV%%"},"recognization":2,"requestTemplate":1,"resolutionCX":3264,"resolutionCY":2448,"sceneMode":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0}
|
@ -1 +1 @@
|
|||||||
{"blobName16":"354","blobName32":"366","blobName8":"output","borderColor":16776960,"enabled":0,"items":[{"enabled":1,"iid":0,"name":"\u6316\u6398\u673a","prob":0.5,"subType":5,"type":1},{"enabled":1,"iid":1,"name":"\u540a\u5854","prob":0.5,"subType":2,"type":1},{"enabled":1,"iid":2,"name":"\u540a\u8f66","prob":0.5,"subType":1,"type":1},{"enabled":1,"iid":3,"name":"\u6c34\u6ce5\u6cf5\u8f66","prob":0.5,"subType":4,"type":1},{"enabled":1,"iid":4,"name":"\u5c71\u706b","prob":0.5,"subType":40,"type":4},{"enabled":1,"iid":5,"name":"\u70df\u96fe","prob":0.5,"subType":41,"type":4},{"enabled":1,"iid":6,"name":"\u63a8\u571f\u673a","prob":0.5,"subType":3,"type":1},{"enabled":1,"iid":7,"name":"\u7ffb\u6597\u8f66","prob":0.5,"subType":10,"type":1},{"enabled":1,"iid":8,"name":"\u5bfc\u7ebf\u5f02\u7269","prob":0.5,"subType":1,"type":3},{"enabled":1,"iid":9,"name":"\u9632\u5c18\u7f51","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":10,"name":"\u538b\u8def\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":11,"name":"\u6405\u62cc\u8f66","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":12,"name":"\u6869\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":13,"name":"\u56f4\u6321","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":14,"name":"\u6c34\u9a6c","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":15,"name":"\u5b89\u5168\u5e3d","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":16,"name":"\u4e95\u76d6\u7f3a\u5931","prob":1.0099999904632568,"subType":2,"type":3}],"textColor":16776960,"thickness":4,"version":"2024-12-30"}
|
{"blobName16":"354","blobName32":"366","blobName8":"output","borderColor":16776960,"enabled":1,"items":[{"enabled":1,"iid":0,"name":"\u6316\u6398\u673a","prob":0.5,"subType":5,"type":1},{"enabled":1,"iid":1,"name":"\u540a\u5854","prob":0.5,"subType":2,"type":1},{"enabled":1,"iid":2,"name":"\u540a\u8f66","prob":0.5,"subType":1,"type":1},{"enabled":1,"iid":3,"name":"\u6c34\u6ce5\u6cf5\u8f66","prob":0.5,"subType":4,"type":1},{"enabled":1,"iid":4,"name":"\u5c71\u706b","prob":0.5,"subType":40,"type":4},{"enabled":1,"iid":5,"name":"\u70df\u96fe","prob":0.5,"subType":41,"type":4},{"enabled":1,"iid":6,"name":"\u63a8\u571f\u673a","prob":0.5,"subType":3,"type":1},{"enabled":1,"iid":7,"name":"\u7ffb\u6597\u8f66","prob":0.5,"subType":10,"type":1},{"enabled":1,"iid":8,"name":"\u5bfc\u7ebf\u5f02\u7269","prob":0.5,"subType":1,"type":3},{"enabled":1,"iid":9,"name":"\u9632\u5c18\u7f51","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":10,"name":"\u538b\u8def\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":11,"name":"\u6405\u62cc\u8f66","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":12,"name":"\u6869\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":13,"name":"\u56f4\u6321","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":14,"name":"\u6c34\u9a6c","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":15,"name":"\u5b89\u5168\u5e3d","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":16,"name":"\u4e95\u76d6\u7f3a\u5931","prob":1.0099999904632568,"subType":2,"type":3}],"textColor":16776960,"thickness":4}
|
Binary file not shown.
@ -0,0 +1,175 @@
|
|||||||
|
7767517
|
||||||
|
173 197
|
||||||
|
Input images 0 1 images
|
||||||
|
Convolution /model.0/conv/Conv 1 1 images /model.0/conv/Conv_output_0 0=32 1=6 11=6 2=1 12=1 3=2 13=2 4=2 14=2 15=2 16=2 5=1 6=3456
|
||||||
|
Swish /model.0/act/Mul 1 1 /model.0/conv/Conv_output_0 /model.0/act/Mul_output_0
|
||||||
|
Convolution /model.1/conv/Conv 1 1 /model.0/act/Mul_output_0 /model.1/conv/Conv_output_0 0=64 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=18432
|
||||||
|
Swish /model.1/act/Mul 1 1 /model.1/conv/Conv_output_0 /model.1/act/Mul_output_0
|
||||||
|
Split splitncnn_0 1 2 /model.1/act/Mul_output_0 /model.1/act/Mul_output_0_splitncnn_0 /model.1/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.2/cv1/conv/Conv 1 1 /model.1/act/Mul_output_0_splitncnn_1 /model.2/cv1/conv/Conv_output_0 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=2048
|
||||||
|
Swish /model.2/cv1/act/Mul 1 1 /model.2/cv1/conv/Conv_output_0 /model.2/cv1/act/Mul_output_0
|
||||||
|
Split splitncnn_1 1 2 /model.2/cv1/act/Mul_output_0 /model.2/cv1/act/Mul_output_0_splitncnn_0 /model.2/cv1/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.2/m/m.0/cv1/conv/Conv 1 1 /model.2/cv1/act/Mul_output_0_splitncnn_1 /model.2/m/m.0/cv1/conv/Conv_output_0 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=1024
|
||||||
|
Swish /model.2/m/m.0/cv1/act/Mul 1 1 /model.2/m/m.0/cv1/conv/Conv_output_0 /model.2/m/m.0/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.2/m/m.0/cv2/conv/Conv 1 1 /model.2/m/m.0/cv1/act/Mul_output_0 /model.2/m/m.0/cv2/conv/Conv_output_0 0=32 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=9216
|
||||||
|
Swish /model.2/m/m.0/cv2/act/Mul 1 1 /model.2/m/m.0/cv2/conv/Conv_output_0 /model.2/m/m.0/cv2/act/Mul_output_0
|
||||||
|
BinaryOp /model.2/m/m.0/Add 2 1 /model.2/cv1/act/Mul_output_0_splitncnn_0 /model.2/m/m.0/cv2/act/Mul_output_0 /model.2/m/m.0/Add_output_0 0=0
|
||||||
|
Convolution /model.2/cv2/conv/Conv 1 1 /model.1/act/Mul_output_0_splitncnn_0 /model.2/cv2/conv/Conv_output_0 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=2048
|
||||||
|
Swish /model.2/cv2/act/Mul 1 1 /model.2/cv2/conv/Conv_output_0 /model.2/cv2/act/Mul_output_0
|
||||||
|
Concat /model.2/Concat 2 1 /model.2/m/m.0/Add_output_0 /model.2/cv2/act/Mul_output_0 /model.2/Concat_output_0 0=0
|
||||||
|
Convolution /model.2/cv3/conv/Conv 1 1 /model.2/Concat_output_0 /model.2/cv3/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
|
||||||
|
Swish /model.2/cv3/act/Mul 1 1 /model.2/cv3/conv/Conv_output_0 /model.2/cv3/act/Mul_output_0
|
||||||
|
Convolution /model.3/conv/Conv 1 1 /model.2/cv3/act/Mul_output_0 /model.3/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=73728
|
||||||
|
Swish /model.3/act/Mul 1 1 /model.3/conv/Conv_output_0 /model.3/act/Mul_output_0
|
||||||
|
Split splitncnn_2 1 2 /model.3/act/Mul_output_0 /model.3/act/Mul_output_0_splitncnn_0 /model.3/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.4/cv1/conv/Conv 1 1 /model.3/act/Mul_output_0_splitncnn_1 /model.4/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=8192
|
||||||
|
Swish /model.4/cv1/act/Mul 1 1 /model.4/cv1/conv/Conv_output_0 /model.4/cv1/act/Mul_output_0
|
||||||
|
Split splitncnn_3 1 2 /model.4/cv1/act/Mul_output_0 /model.4/cv1/act/Mul_output_0_splitncnn_0 /model.4/cv1/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.4/m/m.0/cv1/conv/Conv 1 1 /model.4/cv1/act/Mul_output_0_splitncnn_1 /model.4/m/m.0/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
|
||||||
|
Swish /model.4/m/m.0/cv1/act/Mul 1 1 /model.4/m/m.0/cv1/conv/Conv_output_0 /model.4/m/m.0/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.4/m/m.0/cv2/conv/Conv 1 1 /model.4/m/m.0/cv1/act/Mul_output_0 /model.4/m/m.0/cv2/conv/Conv_output_0 0=64 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=36864
|
||||||
|
Swish /model.4/m/m.0/cv2/act/Mul 1 1 /model.4/m/m.0/cv2/conv/Conv_output_0 /model.4/m/m.0/cv2/act/Mul_output_0
|
||||||
|
BinaryOp /model.4/m/m.0/Add 2 1 /model.4/cv1/act/Mul_output_0_splitncnn_0 /model.4/m/m.0/cv2/act/Mul_output_0 /model.4/m/m.0/Add_output_0 0=0
|
||||||
|
Split splitncnn_4 1 2 /model.4/m/m.0/Add_output_0 /model.4/m/m.0/Add_output_0_splitncnn_0 /model.4/m/m.0/Add_output_0_splitncnn_1
|
||||||
|
Convolution /model.4/m/m.1/cv1/conv/Conv 1 1 /model.4/m/m.0/Add_output_0_splitncnn_1 /model.4/m/m.1/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
|
||||||
|
Swish /model.4/m/m.1/cv1/act/Mul 1 1 /model.4/m/m.1/cv1/conv/Conv_output_0 /model.4/m/m.1/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.4/m/m.1/cv2/conv/Conv 1 1 /model.4/m/m.1/cv1/act/Mul_output_0 /model.4/m/m.1/cv2/conv/Conv_output_0 0=64 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=36864
|
||||||
|
Swish /model.4/m/m.1/cv2/act/Mul 1 1 /model.4/m/m.1/cv2/conv/Conv_output_0 /model.4/m/m.1/cv2/act/Mul_output_0
|
||||||
|
BinaryOp /model.4/m/m.1/Add 2 1 /model.4/m/m.0/Add_output_0_splitncnn_0 /model.4/m/m.1/cv2/act/Mul_output_0 /model.4/m/m.1/Add_output_0 0=0
|
||||||
|
Convolution /model.4/cv2/conv/Conv 1 1 /model.3/act/Mul_output_0_splitncnn_0 /model.4/cv2/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=8192
|
||||||
|
Swish /model.4/cv2/act/Mul 1 1 /model.4/cv2/conv/Conv_output_0 /model.4/cv2/act/Mul_output_0
|
||||||
|
Concat /model.4/Concat 2 1 /model.4/m/m.1/Add_output_0 /model.4/cv2/act/Mul_output_0 /model.4/Concat_output_0 0=0
|
||||||
|
Convolution /model.4/cv3/conv/Conv 1 1 /model.4/Concat_output_0 /model.4/cv3/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.4/cv3/act/Mul 1 1 /model.4/cv3/conv/Conv_output_0 /model.4/cv3/act/Mul_output_0
|
||||||
|
Split splitncnn_5 1 2 /model.4/cv3/act/Mul_output_0 /model.4/cv3/act/Mul_output_0_splitncnn_0 /model.4/cv3/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.5/conv/Conv 1 1 /model.4/cv3/act/Mul_output_0_splitncnn_1 /model.5/conv/Conv_output_0 0=256 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=294912
|
||||||
|
Swish /model.5/act/Mul 1 1 /model.5/conv/Conv_output_0 /model.5/act/Mul_output_0
|
||||||
|
Split splitncnn_6 1 2 /model.5/act/Mul_output_0 /model.5/act/Mul_output_0_splitncnn_0 /model.5/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.6/cv1/conv/Conv 1 1 /model.5/act/Mul_output_0_splitncnn_1 /model.6/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||||
|
Swish /model.6/cv1/act/Mul 1 1 /model.6/cv1/conv/Conv_output_0 /model.6/cv1/act/Mul_output_0
|
||||||
|
Split splitncnn_7 1 2 /model.6/cv1/act/Mul_output_0 /model.6/cv1/act/Mul_output_0_splitncnn_0 /model.6/cv1/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.6/m/m.0/cv1/conv/Conv 1 1 /model.6/cv1/act/Mul_output_0_splitncnn_1 /model.6/m/m.0/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.6/m/m.0/cv1/act/Mul 1 1 /model.6/m/m.0/cv1/conv/Conv_output_0 /model.6/m/m.0/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.6/m/m.0/cv2/conv/Conv 1 1 /model.6/m/m.0/cv1/act/Mul_output_0 /model.6/m/m.0/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||||
|
Swish /model.6/m/m.0/cv2/act/Mul 1 1 /model.6/m/m.0/cv2/conv/Conv_output_0 /model.6/m/m.0/cv2/act/Mul_output_0
|
||||||
|
BinaryOp /model.6/m/m.0/Add 2 1 /model.6/cv1/act/Mul_output_0_splitncnn_0 /model.6/m/m.0/cv2/act/Mul_output_0 /model.6/m/m.0/Add_output_0 0=0
|
||||||
|
Split splitncnn_8 1 2 /model.6/m/m.0/Add_output_0 /model.6/m/m.0/Add_output_0_splitncnn_0 /model.6/m/m.0/Add_output_0_splitncnn_1
|
||||||
|
Convolution /model.6/m/m.1/cv1/conv/Conv 1 1 /model.6/m/m.0/Add_output_0_splitncnn_1 /model.6/m/m.1/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.6/m/m.1/cv1/act/Mul 1 1 /model.6/m/m.1/cv1/conv/Conv_output_0 /model.6/m/m.1/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.6/m/m.1/cv2/conv/Conv 1 1 /model.6/m/m.1/cv1/act/Mul_output_0 /model.6/m/m.1/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||||
|
Swish /model.6/m/m.1/cv2/act/Mul 1 1 /model.6/m/m.1/cv2/conv/Conv_output_0 /model.6/m/m.1/cv2/act/Mul_output_0
|
||||||
|
BinaryOp /model.6/m/m.1/Add 2 1 /model.6/m/m.0/Add_output_0_splitncnn_0 /model.6/m/m.1/cv2/act/Mul_output_0 /model.6/m/m.1/Add_output_0 0=0
|
||||||
|
Split splitncnn_9 1 2 /model.6/m/m.1/Add_output_0 /model.6/m/m.1/Add_output_0_splitncnn_0 /model.6/m/m.1/Add_output_0_splitncnn_1
|
||||||
|
Convolution /model.6/m/m.2/cv1/conv/Conv 1 1 /model.6/m/m.1/Add_output_0_splitncnn_1 /model.6/m/m.2/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.6/m/m.2/cv1/act/Mul 1 1 /model.6/m/m.2/cv1/conv/Conv_output_0 /model.6/m/m.2/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.6/m/m.2/cv2/conv/Conv 1 1 /model.6/m/m.2/cv1/act/Mul_output_0 /model.6/m/m.2/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||||
|
Swish /model.6/m/m.2/cv2/act/Mul 1 1 /model.6/m/m.2/cv2/conv/Conv_output_0 /model.6/m/m.2/cv2/act/Mul_output_0
|
||||||
|
BinaryOp /model.6/m/m.2/Add 2 1 /model.6/m/m.1/Add_output_0_splitncnn_0 /model.6/m/m.2/cv2/act/Mul_output_0 /model.6/m/m.2/Add_output_0 0=0
|
||||||
|
Convolution /model.6/cv2/conv/Conv 1 1 /model.5/act/Mul_output_0_splitncnn_0 /model.6/cv2/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||||
|
Swish /model.6/cv2/act/Mul 1 1 /model.6/cv2/conv/Conv_output_0 /model.6/cv2/act/Mul_output_0
|
||||||
|
Concat /model.6/Concat 2 1 /model.6/m/m.2/Add_output_0 /model.6/cv2/act/Mul_output_0 /model.6/Concat_output_0 0=0
|
||||||
|
Convolution /model.6/cv3/conv/Conv 1 1 /model.6/Concat_output_0 /model.6/cv3/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||||
|
Swish /model.6/cv3/act/Mul 1 1 /model.6/cv3/conv/Conv_output_0 /model.6/cv3/act/Mul_output_0
|
||||||
|
Split splitncnn_10 1 2 /model.6/cv3/act/Mul_output_0 /model.6/cv3/act/Mul_output_0_splitncnn_0 /model.6/cv3/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.7/conv/Conv 1 1 /model.6/cv3/act/Mul_output_0_splitncnn_1 /model.7/conv/Conv_output_0 0=512 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=1179648
|
||||||
|
Swish /model.7/act/Mul 1 1 /model.7/conv/Conv_output_0 /model.7/act/Mul_output_0
|
||||||
|
Split splitncnn_11 1 2 /model.7/act/Mul_output_0 /model.7/act/Mul_output_0_splitncnn_0 /model.7/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.8/cv1/conv/Conv 1 1 /model.7/act/Mul_output_0_splitncnn_1 /model.8/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||||
|
Swish /model.8/cv1/act/Mul 1 1 /model.8/cv1/conv/Conv_output_0 /model.8/cv1/act/Mul_output_0
|
||||||
|
Split splitncnn_12 1 2 /model.8/cv1/act/Mul_output_0 /model.8/cv1/act/Mul_output_0_splitncnn_0 /model.8/cv1/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.8/m/m.0/cv1/conv/Conv 1 1 /model.8/cv1/act/Mul_output_0_splitncnn_1 /model.8/m/m.0/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||||
|
Swish /model.8/m/m.0/cv1/act/Mul 1 1 /model.8/m/m.0/cv1/conv/Conv_output_0 /model.8/m/m.0/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.8/m/m.0/cv2/conv/Conv 1 1 /model.8/m/m.0/cv1/act/Mul_output_0 /model.8/m/m.0/cv2/conv/Conv_output_0 0=256 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=589824
|
||||||
|
Swish /model.8/m/m.0/cv2/act/Mul 1 1 /model.8/m/m.0/cv2/conv/Conv_output_0 /model.8/m/m.0/cv2/act/Mul_output_0
|
||||||
|
BinaryOp /model.8/m/m.0/Add 2 1 /model.8/cv1/act/Mul_output_0_splitncnn_0 /model.8/m/m.0/cv2/act/Mul_output_0 /model.8/m/m.0/Add_output_0 0=0
|
||||||
|
Convolution /model.8/cv2/conv/Conv 1 1 /model.7/act/Mul_output_0_splitncnn_0 /model.8/cv2/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||||
|
Swish /model.8/cv2/act/Mul 1 1 /model.8/cv2/conv/Conv_output_0 /model.8/cv2/act/Mul_output_0
|
||||||
|
Concat /model.8/Concat 2 1 /model.8/m/m.0/Add_output_0 /model.8/cv2/act/Mul_output_0 /model.8/Concat_output_0 0=0
|
||||||
|
Convolution /model.8/cv3/conv/Conv 1 1 /model.8/Concat_output_0 /model.8/cv3/conv/Conv_output_0 0=512 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=262144
|
||||||
|
Swish /model.8/cv3/act/Mul 1 1 /model.8/cv3/conv/Conv_output_0 /model.8/cv3/act/Mul_output_0
|
||||||
|
Convolution /model.9/cv1/conv/Conv 1 1 /model.8/cv3/act/Mul_output_0 /model.9/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||||
|
Swish /model.9/cv1/act/Mul 1 1 /model.9/cv1/conv/Conv_output_0 /model.9/cv1/act/Mul_output_0
|
||||||
|
Split splitncnn_13 1 2 /model.9/cv1/act/Mul_output_0 /model.9/cv1/act/Mul_output_0_splitncnn_0 /model.9/cv1/act/Mul_output_0_splitncnn_1
|
||||||
|
Pooling /model.9/m/MaxPool 1 1 /model.9/cv1/act/Mul_output_0_splitncnn_1 /model.9/m/MaxPool_output_0 0=0 1=5 11=5 2=1 12=1 3=2 13=2 14=2 15=2 5=1
|
||||||
|
Split splitncnn_14 1 2 /model.9/m/MaxPool_output_0 /model.9/m/MaxPool_output_0_splitncnn_0 /model.9/m/MaxPool_output_0_splitncnn_1
|
||||||
|
Pooling /model.9/m_1/MaxPool 1 1 /model.9/m/MaxPool_output_0_splitncnn_1 /model.9/m_1/MaxPool_output_0 0=0 1=5 11=5 2=1 12=1 3=2 13=2 14=2 15=2 5=1
|
||||||
|
Split splitncnn_15 1 2 /model.9/m_1/MaxPool_output_0 /model.9/m_1/MaxPool_output_0_splitncnn_0 /model.9/m_1/MaxPool_output_0_splitncnn_1
|
||||||
|
Pooling /model.9/m_2/MaxPool 1 1 /model.9/m_1/MaxPool_output_0_splitncnn_1 /model.9/m_2/MaxPool_output_0 0=0 1=5 11=5 2=1 12=1 3=2 13=2 14=2 15=2 5=1
|
||||||
|
Concat /model.9/Concat 4 1 /model.9/cv1/act/Mul_output_0_splitncnn_0 /model.9/m/MaxPool_output_0_splitncnn_0 /model.9/m_1/MaxPool_output_0_splitncnn_0 /model.9/m_2/MaxPool_output_0 /model.9/Concat_output_0 0=0
|
||||||
|
Convolution /model.9/cv2/conv/Conv 1 1 /model.9/Concat_output_0 /model.9/cv2/conv/Conv_output_0 0=512 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=524288
|
||||||
|
Swish /model.9/cv2/act/Mul 1 1 /model.9/cv2/conv/Conv_output_0 /model.9/cv2/act/Mul_output_0
|
||||||
|
Convolution /model.10/conv/Conv 1 1 /model.9/cv2/act/Mul_output_0 /model.10/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||||
|
Swish /model.10/act/Mul 1 1 /model.10/conv/Conv_output_0 /model.10/act/Mul_output_0
|
||||||
|
Split splitncnn_16 1 2 /model.10/act/Mul_output_0 /model.10/act/Mul_output_0_splitncnn_0 /model.10/act/Mul_output_0_splitncnn_1
|
||||||
|
Interp /model.11/Resize 1 1 /model.10/act/Mul_output_0_splitncnn_1 /model.11/Resize_output_0 0=1 1=2.000000e+00 2=2.000000e+00 3=0 4=0 6=0
|
||||||
|
Concat /model.12/Concat 2 1 /model.11/Resize_output_0 /model.6/cv3/act/Mul_output_0_splitncnn_0 /model.12/Concat_output_0 0=0
|
||||||
|
Split splitncnn_17 1 2 /model.12/Concat_output_0 /model.12/Concat_output_0_splitncnn_0 /model.12/Concat_output_0_splitncnn_1
|
||||||
|
Convolution /model.13/cv1/conv/Conv 1 1 /model.12/Concat_output_0_splitncnn_1 /model.13/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||||
|
Swish /model.13/cv1/act/Mul 1 1 /model.13/cv1/conv/Conv_output_0 /model.13/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.13/m/m.0/cv1/conv/Conv 1 1 /model.13/cv1/act/Mul_output_0 /model.13/m/m.0/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.13/m/m.0/cv1/act/Mul 1 1 /model.13/m/m.0/cv1/conv/Conv_output_0 /model.13/m/m.0/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.13/m/m.0/cv2/conv/Conv 1 1 /model.13/m/m.0/cv1/act/Mul_output_0 /model.13/m/m.0/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||||
|
Swish /model.13/m/m.0/cv2/act/Mul 1 1 /model.13/m/m.0/cv2/conv/Conv_output_0 /model.13/m/m.0/cv2/act/Mul_output_0
|
||||||
|
Convolution /model.13/cv2/conv/Conv 1 1 /model.12/Concat_output_0_splitncnn_0 /model.13/cv2/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||||
|
Swish /model.13/cv2/act/Mul 1 1 /model.13/cv2/conv/Conv_output_0 /model.13/cv2/act/Mul_output_0
|
||||||
|
Concat /model.13/Concat 2 1 /model.13/m/m.0/cv2/act/Mul_output_0 /model.13/cv2/act/Mul_output_0 /model.13/Concat_output_0 0=0
|
||||||
|
Convolution /model.13/cv3/conv/Conv 1 1 /model.13/Concat_output_0 /model.13/cv3/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||||
|
Swish /model.13/cv3/act/Mul 1 1 /model.13/cv3/conv/Conv_output_0 /model.13/cv3/act/Mul_output_0
|
||||||
|
Convolution /model.14/conv/Conv 1 1 /model.13/cv3/act/Mul_output_0 /model.14/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||||
|
Swish /model.14/act/Mul 1 1 /model.14/conv/Conv_output_0 /model.14/act/Mul_output_0
|
||||||
|
Split splitncnn_18 1 2 /model.14/act/Mul_output_0 /model.14/act/Mul_output_0_splitncnn_0 /model.14/act/Mul_output_0_splitncnn_1
|
||||||
|
Interp /model.15/Resize 1 1 /model.14/act/Mul_output_0_splitncnn_1 /model.15/Resize_output_0 0=1 1=2.000000e+00 2=2.000000e+00 3=0 4=0 6=0
|
||||||
|
Concat /model.16/Concat 2 1 /model.15/Resize_output_0 /model.4/cv3/act/Mul_output_0_splitncnn_0 /model.16/Concat_output_0 0=0
|
||||||
|
Split splitncnn_19 1 2 /model.16/Concat_output_0 /model.16/Concat_output_0_splitncnn_0 /model.16/Concat_output_0_splitncnn_1
|
||||||
|
Convolution /model.17/cv1/conv/Conv 1 1 /model.16/Concat_output_0_splitncnn_1 /model.17/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.17/cv1/act/Mul 1 1 /model.17/cv1/conv/Conv_output_0 /model.17/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.17/m/m.0/cv1/conv/Conv 1 1 /model.17/cv1/act/Mul_output_0 /model.17/m/m.0/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
|
||||||
|
Swish /model.17/m/m.0/cv1/act/Mul 1 1 /model.17/m/m.0/cv1/conv/Conv_output_0 /model.17/m/m.0/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.17/m/m.0/cv2/conv/Conv 1 1 /model.17/m/m.0/cv1/act/Mul_output_0 /model.17/m/m.0/cv2/conv/Conv_output_0 0=64 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=36864
|
||||||
|
Swish /model.17/m/m.0/cv2/act/Mul 1 1 /model.17/m/m.0/cv2/conv/Conv_output_0 /model.17/m/m.0/cv2/act/Mul_output_0
|
||||||
|
Convolution /model.17/cv2/conv/Conv 1 1 /model.16/Concat_output_0_splitncnn_0 /model.17/cv2/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.17/cv2/act/Mul 1 1 /model.17/cv2/conv/Conv_output_0 /model.17/cv2/act/Mul_output_0
|
||||||
|
Concat /model.17/Concat 2 1 /model.17/m/m.0/cv2/act/Mul_output_0 /model.17/cv2/act/Mul_output_0 /model.17/Concat_output_0 0=0
|
||||||
|
Convolution /model.17/cv3/conv/Conv 1 1 /model.17/Concat_output_0 /model.17/cv3/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.17/cv3/act/Mul 1 1 /model.17/cv3/conv/Conv_output_0 /model.17/cv3/act/Mul_output_0
|
||||||
|
Split splitncnn_20 1 2 /model.17/cv3/act/Mul_output_0 /model.17/cv3/act/Mul_output_0_splitncnn_0 /model.17/cv3/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.18/conv/Conv 1 1 /model.17/cv3/act/Mul_output_0_splitncnn_1 /model.18/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||||
|
Swish /model.18/act/Mul 1 1 /model.18/conv/Conv_output_0 /model.18/act/Mul_output_0
|
||||||
|
Concat /model.19/Concat 2 1 /model.18/act/Mul_output_0 /model.14/act/Mul_output_0_splitncnn_0 /model.19/Concat_output_0 0=0
|
||||||
|
Split splitncnn_21 1 2 /model.19/Concat_output_0 /model.19/Concat_output_0_splitncnn_0 /model.19/Concat_output_0_splitncnn_1
|
||||||
|
Convolution /model.20/cv1/conv/Conv 1 1 /model.19/Concat_output_0_splitncnn_1 /model.20/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||||
|
Swish /model.20/cv1/act/Mul 1 1 /model.20/cv1/conv/Conv_output_0 /model.20/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.20/m/m.0/cv1/conv/Conv 1 1 /model.20/cv1/act/Mul_output_0 /model.20/m/m.0/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||||
|
Swish /model.20/m/m.0/cv1/act/Mul 1 1 /model.20/m/m.0/cv1/conv/Conv_output_0 /model.20/m/m.0/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.20/m/m.0/cv2/conv/Conv 1 1 /model.20/m/m.0/cv1/act/Mul_output_0 /model.20/m/m.0/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||||
|
Swish /model.20/m/m.0/cv2/act/Mul 1 1 /model.20/m/m.0/cv2/conv/Conv_output_0 /model.20/m/m.0/cv2/act/Mul_output_0
|
||||||
|
Convolution /model.20/cv2/conv/Conv 1 1 /model.19/Concat_output_0_splitncnn_0 /model.20/cv2/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||||
|
Swish /model.20/cv2/act/Mul 1 1 /model.20/cv2/conv/Conv_output_0 /model.20/cv2/act/Mul_output_0
|
||||||
|
Concat /model.20/Concat 2 1 /model.20/m/m.0/cv2/act/Mul_output_0 /model.20/cv2/act/Mul_output_0 /model.20/Concat_output_0 0=0
|
||||||
|
Convolution /model.20/cv3/conv/Conv 1 1 /model.20/Concat_output_0 /model.20/cv3/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||||
|
Swish /model.20/cv3/act/Mul 1 1 /model.20/cv3/conv/Conv_output_0 /model.20/cv3/act/Mul_output_0
|
||||||
|
Split splitncnn_22 1 2 /model.20/cv3/act/Mul_output_0 /model.20/cv3/act/Mul_output_0_splitncnn_0 /model.20/cv3/act/Mul_output_0_splitncnn_1
|
||||||
|
Convolution /model.21/conv/Conv 1 1 /model.20/cv3/act/Mul_output_0_splitncnn_1 /model.21/conv/Conv_output_0 0=256 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=589824
|
||||||
|
Swish /model.21/act/Mul 1 1 /model.21/conv/Conv_output_0 /model.21/act/Mul_output_0
|
||||||
|
Concat /model.22/Concat 2 1 /model.21/act/Mul_output_0 /model.10/act/Mul_output_0_splitncnn_0 /model.22/Concat_output_0 0=0
|
||||||
|
Split splitncnn_23 1 2 /model.22/Concat_output_0 /model.22/Concat_output_0_splitncnn_0 /model.22/Concat_output_0_splitncnn_1
|
||||||
|
Convolution /model.23/cv1/conv/Conv 1 1 /model.22/Concat_output_0_splitncnn_1 /model.23/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||||
|
Swish /model.23/cv1/act/Mul 1 1 /model.23/cv1/conv/Conv_output_0 /model.23/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.23/m/m.0/cv1/conv/Conv 1 1 /model.23/cv1/act/Mul_output_0 /model.23/m/m.0/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||||
|
Swish /model.23/m/m.0/cv1/act/Mul 1 1 /model.23/m/m.0/cv1/conv/Conv_output_0 /model.23/m/m.0/cv1/act/Mul_output_0
|
||||||
|
Convolution /model.23/m/m.0/cv2/conv/Conv 1 1 /model.23/m/m.0/cv1/act/Mul_output_0 /model.23/m/m.0/cv2/conv/Conv_output_0 0=256 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=589824
|
||||||
|
Swish /model.23/m/m.0/cv2/act/Mul 1 1 /model.23/m/m.0/cv2/conv/Conv_output_0 /model.23/m/m.0/cv2/act/Mul_output_0
|
||||||
|
Convolution /model.23/cv2/conv/Conv 1 1 /model.22/Concat_output_0_splitncnn_0 /model.23/cv2/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||||
|
Swish /model.23/cv2/act/Mul 1 1 /model.23/cv2/conv/Conv_output_0 /model.23/cv2/act/Mul_output_0
|
||||||
|
Concat /model.23/Concat 2 1 /model.23/m/m.0/cv2/act/Mul_output_0 /model.23/cv2/act/Mul_output_0 /model.23/Concat_output_0 0=0
|
||||||
|
Convolution /model.23/cv3/conv/Conv 1 1 /model.23/Concat_output_0 /model.23/cv3/conv/Conv_output_0 0=512 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=262144
|
||||||
|
Swish /model.23/cv3/act/Mul 1 1 /model.23/cv3/conv/Conv_output_0 /model.23/cv3/act/Mul_output_0
|
||||||
|
Convolution /model.24/m.0/Conv 1 1 /model.17/cv3/act/Mul_output_0_splitncnn_0 /model.24/m.0/Conv_output_0 0=66 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=8448
|
||||||
|
Reshape /model.24/Reshape 1 1 /model.24/m.0/Conv_output_0 /model.24/Reshape_output_0 0=-1 1=22 2=3
|
||||||
|
Permute /model.24/Transpose 1 1 /model.24/Reshape_output_0 output 0=1
|
||||||
|
Convolution /model.24/m.1/Conv 1 1 /model.20/cv3/act/Mul_output_0_splitncnn_0 /model.24/m.1/Conv_output_0 0=66 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16896
|
||||||
|
Reshape /model.24/Reshape_1 1 1 /model.24/m.1/Conv_output_0 /model.24/Reshape_1_output_0 0=-1 1=22 2=3
|
||||||
|
Permute /model.24/Transpose_1 1 1 /model.24/Reshape_1_output_0 354 0=1
|
||||||
|
Convolution /model.24/m.2/Conv 1 1 /model.23/cv3/act/Mul_output_0 /model.24/m.2/Conv_output_0 0=66 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=33792
|
||||||
|
Reshape /model.24/Reshape_2 1 1 /model.24/m.2/Conv_output_0 /model.24/Reshape_2_output_0 0=-1 1=22 2=3
|
||||||
|
Permute /model.24/Transpose_2 1 1 /model.24/Reshape_2_output_0 366 0=1
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
|||||||
{"absHeartbeats":[33449,85836],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","syncTime":0,"timeForKeepingLogs":15,"usingAbsHbTime":1}
|
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":1,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
@ -1,443 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright 2003-2005 Colin Percival
|
|
||||||
* Copyright 2012 Matthew Endsley
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted providing that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "bsdiff.h"
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define MIN(x,y) (((x)<(y)) ? (x) : (y))
|
|
||||||
|
|
||||||
static void split(int64_t *I,int64_t *V,int64_t start,int64_t len,int64_t h)
|
|
||||||
{
|
|
||||||
int64_t i,j,k,x,tmp,jj,kk;
|
|
||||||
|
|
||||||
if(len<16) {
|
|
||||||
for(k=start;k<start+len;k+=j) {
|
|
||||||
j=1;x=V[I[k]+h];
|
|
||||||
for(i=1;k+i<start+len;i++) {
|
|
||||||
if(V[I[k+i]+h]<x) {
|
|
||||||
x=V[I[k+i]+h];
|
|
||||||
j=0;
|
|
||||||
};
|
|
||||||
if(V[I[k+i]+h]==x) {
|
|
||||||
tmp=I[k+j];I[k+j]=I[k+i];I[k+i]=tmp;
|
|
||||||
j++;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
for(i=0;i<j;i++) V[I[k+i]]=k+j-1;
|
|
||||||
if(j==1) I[k]=-1;
|
|
||||||
};
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
x=V[I[start+len/2]+h];
|
|
||||||
jj=0;kk=0;
|
|
||||||
for(i=start;i<start+len;i++) {
|
|
||||||
if(V[I[i]+h]<x) jj++;
|
|
||||||
if(V[I[i]+h]==x) kk++;
|
|
||||||
};
|
|
||||||
jj+=start;kk+=jj;
|
|
||||||
|
|
||||||
i=start;j=0;k=0;
|
|
||||||
while(i<jj) {
|
|
||||||
if(V[I[i]+h]<x) {
|
|
||||||
i++;
|
|
||||||
} else if(V[I[i]+h]==x) {
|
|
||||||
tmp=I[i];I[i]=I[jj+j];I[jj+j]=tmp;
|
|
||||||
j++;
|
|
||||||
} else {
|
|
||||||
tmp=I[i];I[i]=I[kk+k];I[kk+k]=tmp;
|
|
||||||
k++;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
while(jj+j<kk) {
|
|
||||||
if(V[I[jj+j]+h]==x) {
|
|
||||||
j++;
|
|
||||||
} else {
|
|
||||||
tmp=I[jj+j];I[jj+j]=I[kk+k];I[kk+k]=tmp;
|
|
||||||
k++;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if(jj>start) split(I,V,start,jj-start,h);
|
|
||||||
|
|
||||||
for(i=0;i<kk-jj;i++) V[I[jj+i]]=kk-1;
|
|
||||||
if(jj==kk-1) I[jj]=-1;
|
|
||||||
|
|
||||||
if(start+len>kk) split(I,V,kk,start+len-kk,h);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void qsufsort(int64_t *I,int64_t *V,const uint8_t *old,int64_t oldsize)
|
|
||||||
{
|
|
||||||
int64_t buckets[256];
|
|
||||||
int64_t i,h,len;
|
|
||||||
|
|
||||||
for(i=0;i<256;i++) buckets[i]=0;
|
|
||||||
for(i=0;i<oldsize;i++) buckets[old[i]]++;
|
|
||||||
for(i=1;i<256;i++) buckets[i]+=buckets[i-1];
|
|
||||||
for(i=255;i>0;i--) buckets[i]=buckets[i-1];
|
|
||||||
buckets[0]=0;
|
|
||||||
|
|
||||||
for(i=0;i<oldsize;i++) I[++buckets[old[i]]]=i;
|
|
||||||
I[0]=oldsize;
|
|
||||||
for(i=0;i<oldsize;i++) V[i]=buckets[old[i]];
|
|
||||||
V[oldsize]=0;
|
|
||||||
for(i=1;i<256;i++) if(buckets[i]==buckets[i-1]+1) I[buckets[i]]=-1;
|
|
||||||
I[0]=-1;
|
|
||||||
|
|
||||||
for(h=1;I[0]!=-(oldsize+1);h+=h) {
|
|
||||||
len=0;
|
|
||||||
for(i=0;i<oldsize+1;) {
|
|
||||||
if(I[i]<0) {
|
|
||||||
len-=I[i];
|
|
||||||
i-=I[i];
|
|
||||||
} else {
|
|
||||||
if(len) I[i-len]=-len;
|
|
||||||
len=V[I[i]]+1-i;
|
|
||||||
split(I,V,i,len,h);
|
|
||||||
i+=len;
|
|
||||||
len=0;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
if(len) I[i-len]=-len;
|
|
||||||
};
|
|
||||||
|
|
||||||
for(i=0;i<oldsize+1;i++) I[V[i]]=i;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t matchlen(const uint8_t *old,int64_t oldsize,const uint8_t *new,int64_t newsize)
|
|
||||||
{
|
|
||||||
int64_t i;
|
|
||||||
|
|
||||||
for(i=0;(i<oldsize)&&(i<newsize);i++)
|
|
||||||
if(old[i]!=new[i]) break;
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t search(const int64_t *I,const uint8_t *old,int64_t oldsize,
|
|
||||||
const uint8_t *new,int64_t newsize,int64_t st,int64_t en,int64_t *pos)
|
|
||||||
{
|
|
||||||
int64_t x,y;
|
|
||||||
|
|
||||||
if(en-st<2) {
|
|
||||||
x=matchlen(old+I[st],oldsize-I[st],new,newsize);
|
|
||||||
y=matchlen(old+I[en],oldsize-I[en],new,newsize);
|
|
||||||
|
|
||||||
if(x>y) {
|
|
||||||
*pos=I[st];
|
|
||||||
return x;
|
|
||||||
} else {
|
|
||||||
*pos=I[en];
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
x=st+(en-st)/2;
|
|
||||||
if(memcmp(old+I[x],new,MIN(oldsize-I[x],newsize))<0) {
|
|
||||||
return search(I,old,oldsize,new,newsize,x,en,pos);
|
|
||||||
} else {
|
|
||||||
return search(I,old,oldsize,new,newsize,st,x,pos);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static void offtout(int64_t x,uint8_t *buf)
|
|
||||||
{
|
|
||||||
int64_t y;
|
|
||||||
|
|
||||||
if(x<0) y=-x; else y=x;
|
|
||||||
|
|
||||||
buf[0]=y%256;y-=buf[0];
|
|
||||||
y=y/256;buf[1]=y%256;y-=buf[1];
|
|
||||||
y=y/256;buf[2]=y%256;y-=buf[2];
|
|
||||||
y=y/256;buf[3]=y%256;y-=buf[3];
|
|
||||||
y=y/256;buf[4]=y%256;y-=buf[4];
|
|
||||||
y=y/256;buf[5]=y%256;y-=buf[5];
|
|
||||||
y=y/256;buf[6]=y%256;y-=buf[6];
|
|
||||||
y=y/256;buf[7]=y%256;
|
|
||||||
|
|
||||||
if(x<0) buf[7]|=0x80;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t writedata(struct bsdiff_stream* stream, const void* buffer, int64_t length)
|
|
||||||
{
|
|
||||||
int64_t result = 0;
|
|
||||||
|
|
||||||
while (length > 0)
|
|
||||||
{
|
|
||||||
const int smallsize = (int)MIN(length, INT_MAX);
|
|
||||||
const int writeresult = stream->write(stream, buffer, smallsize);
|
|
||||||
if (writeresult == -1)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result += writeresult;
|
|
||||||
length -= smallsize;
|
|
||||||
buffer = (uint8_t*)buffer + smallsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct bsdiff_request
|
|
||||||
{
|
|
||||||
const uint8_t* old;
|
|
||||||
int64_t oldsize;
|
|
||||||
const uint8_t* new;
|
|
||||||
int64_t newsize;
|
|
||||||
struct bsdiff_stream* stream;
|
|
||||||
int64_t *I;
|
|
||||||
uint8_t *buffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int bsdiff_internal(const struct bsdiff_request req)
|
|
||||||
{
|
|
||||||
int64_t *I,*V;
|
|
||||||
int64_t scan,pos,len;
|
|
||||||
int64_t lastscan,lastpos,lastoffset;
|
|
||||||
int64_t oldscore,scsc;
|
|
||||||
int64_t s,Sf,lenf,Sb,lenb;
|
|
||||||
int64_t overlap,Ss,lens;
|
|
||||||
int64_t i;
|
|
||||||
uint8_t *buffer;
|
|
||||||
uint8_t buf[8 * 3];
|
|
||||||
|
|
||||||
if((V=req.stream->malloc((req.oldsize+1)*sizeof(int64_t)))==NULL) return -1;
|
|
||||||
I = req.I;
|
|
||||||
|
|
||||||
qsufsort(I,V,req.old,req.oldsize);
|
|
||||||
req.stream->free(V);
|
|
||||||
|
|
||||||
buffer = req.buffer;
|
|
||||||
|
|
||||||
/* Compute the differences, writing ctrl as we go */
|
|
||||||
scan=0;len=0;pos=0;
|
|
||||||
lastscan=0;lastpos=0;lastoffset=0;
|
|
||||||
while(scan<req.newsize) {
|
|
||||||
oldscore=0;
|
|
||||||
|
|
||||||
for(scsc=scan+=len;scan<req.newsize;scan++) {
|
|
||||||
len=search(I,req.old,req.oldsize,req.new+scan,req.newsize-scan,
|
|
||||||
0,req.oldsize,&pos);
|
|
||||||
|
|
||||||
for(;scsc<scan+len;scsc++)
|
|
||||||
if((scsc+lastoffset<req.oldsize) &&
|
|
||||||
(req.old[scsc+lastoffset] == req.new[scsc]))
|
|
||||||
oldscore++;
|
|
||||||
|
|
||||||
if(((len==oldscore) && (len!=0)) ||
|
|
||||||
(len>oldscore+8)) break;
|
|
||||||
|
|
||||||
if((scan+lastoffset<req.oldsize) &&
|
|
||||||
(req.old[scan+lastoffset] == req.new[scan]))
|
|
||||||
oldscore--;
|
|
||||||
};
|
|
||||||
|
|
||||||
if((len!=oldscore) || (scan==req.newsize)) {
|
|
||||||
s=0;Sf=0;lenf=0;
|
|
||||||
for(i=0;(lastscan+i<scan)&&(lastpos+i<req.oldsize);) {
|
|
||||||
if(req.old[lastpos+i]==req.new[lastscan+i]) s++;
|
|
||||||
i++;
|
|
||||||
if(s*2-i>Sf*2-lenf) { Sf=s; lenf=i; };
|
|
||||||
};
|
|
||||||
|
|
||||||
lenb=0;
|
|
||||||
if(scan<req.newsize) {
|
|
||||||
s=0;Sb=0;
|
|
||||||
for(i=1;(scan>=lastscan+i)&&(pos>=i);i++) {
|
|
||||||
if(req.old[pos-i]==req.new[scan-i]) s++;
|
|
||||||
if(s*2-i>Sb*2-lenb) { Sb=s; lenb=i; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if(lastscan+lenf>scan-lenb) {
|
|
||||||
overlap=(lastscan+lenf)-(scan-lenb);
|
|
||||||
s=0;Ss=0;lens=0;
|
|
||||||
for(i=0;i<overlap;i++) {
|
|
||||||
if(req.new[lastscan+lenf-overlap+i]==
|
|
||||||
req.old[lastpos+lenf-overlap+i]) s++;
|
|
||||||
if(req.new[scan-lenb+i]==
|
|
||||||
req.old[pos-lenb+i]) s--;
|
|
||||||
if(s>Ss) { Ss=s; lens=i+1; };
|
|
||||||
};
|
|
||||||
|
|
||||||
lenf+=lens-overlap;
|
|
||||||
lenb-=lens;
|
|
||||||
};
|
|
||||||
|
|
||||||
offtout(lenf,buf);
|
|
||||||
offtout((scan-lenb)-(lastscan+lenf),buf+8);
|
|
||||||
offtout((pos-lenb)-(lastpos+lenf),buf+16);
|
|
||||||
|
|
||||||
/* Write control data */
|
|
||||||
if (writedata(req.stream, buf, sizeof(buf)))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Write diff data */
|
|
||||||
for(i=0;i<lenf;i++)
|
|
||||||
buffer[i]=req.new[lastscan+i]-req.old[lastpos+i];
|
|
||||||
if (writedata(req.stream, buffer, lenf))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Write extra data */
|
|
||||||
for(i=0;i<(scan-lenb)-(lastscan+lenf);i++)
|
|
||||||
buffer[i]=req.new[lastscan+lenf+i];
|
|
||||||
if (writedata(req.stream, buffer, (scan-lenb)-(lastscan+lenf)))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
lastscan=scan-lenb;
|
|
||||||
lastpos=pos-lenb;
|
|
||||||
lastoffset=pos-scan;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int bsdiff(const uint8_t* old, int64_t oldsize, const uint8_t* new, int64_t newsize, struct bsdiff_stream* stream)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
struct bsdiff_request req;
|
|
||||||
|
|
||||||
if((req.I=stream->malloc((oldsize+1)*sizeof(int64_t)))==NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if((req.buffer=stream->malloc(newsize+1))==NULL)
|
|
||||||
{
|
|
||||||
stream->free(req.I);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
req.old = old;
|
|
||||||
req.oldsize = oldsize;
|
|
||||||
req.new = new;
|
|
||||||
req.newsize = newsize;
|
|
||||||
req.stream = stream;
|
|
||||||
|
|
||||||
result = bsdiff_internal(req);
|
|
||||||
|
|
||||||
stream->free(req.buffer);
|
|
||||||
stream->free(req.I);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <bzlib.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static int bz2_write(struct bsdiff_stream* stream, const void* buffer, int size)
|
|
||||||
{
|
|
||||||
int bz2err;
|
|
||||||
BZFILE* bz2;
|
|
||||||
|
|
||||||
bz2 = (BZFILE*)stream->opaque;
|
|
||||||
BZ2_bzWrite(&bz2err, bz2, (void*)buffer, size);
|
|
||||||
if (bz2err != BZ_STREAM_END && bz2err != BZ_OK)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int bsdiff_main(int argc, const char **argv)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
int bz2err;
|
|
||||||
uint8_t *old,*new;
|
|
||||||
off_t oldsize,newsize;
|
|
||||||
uint8_t buf[8];
|
|
||||||
FILE * pf;
|
|
||||||
struct bsdiff_stream stream;
|
|
||||||
BZFILE* bz2;
|
|
||||||
|
|
||||||
memset(&bz2, 0, sizeof(bz2));
|
|
||||||
stream.malloc = malloc;
|
|
||||||
stream.free = free;
|
|
||||||
stream.write = bz2_write;
|
|
||||||
|
|
||||||
if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
|
|
||||||
|
|
||||||
/* Allocate oldsize+1 bytes instead of oldsize bytes to ensure
|
|
||||||
that we never try to malloc(0) and get a NULL pointer */
|
|
||||||
if(((fd=open(argv[1],O_RDONLY,0))<0) ||
|
|
||||||
((oldsize=lseek(fd,0,SEEK_END))==-1) ||
|
|
||||||
((old=malloc(oldsize+1))==NULL) ||
|
|
||||||
(lseek(fd,0,SEEK_SET)!=0) ||
|
|
||||||
(read(fd,old,oldsize)!=oldsize) ||
|
|
||||||
(close(fd)==-1)) err(1,"%s",argv[1]);
|
|
||||||
|
|
||||||
|
|
||||||
/* Allocate newsize+1 bytes instead of newsize bytes to ensure
|
|
||||||
that we never try to malloc(0) and get a NULL pointer */
|
|
||||||
if(((fd=open(argv[2],O_RDONLY,0))<0) ||
|
|
||||||
((newsize=lseek(fd,0,SEEK_END))==-1) ||
|
|
||||||
((new=malloc(newsize+1))==NULL) ||
|
|
||||||
(lseek(fd,0,SEEK_SET)!=0) ||
|
|
||||||
(read(fd,new,newsize)!=newsize) ||
|
|
||||||
(close(fd)==-1)) err(1,"%s",argv[2]);
|
|
||||||
|
|
||||||
/* Create the patch file */
|
|
||||||
if ((pf = fopen(argv[3], "w")) == NULL)
|
|
||||||
err(1, "%s", argv[3]);
|
|
||||||
|
|
||||||
/* Write header (signature+newsize)*/
|
|
||||||
offtout(newsize, buf);
|
|
||||||
if (fwrite("ENDSLEY/BSDIFF43", 16, 1, pf) != 1 ||
|
|
||||||
fwrite(buf, sizeof(buf), 1, pf) != 1)
|
|
||||||
err(1, "Failed to write header");
|
|
||||||
|
|
||||||
|
|
||||||
if (NULL == (bz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)))
|
|
||||||
errx(1, "BZ2_bzWriteOpen, bz2err=%d", bz2err);
|
|
||||||
|
|
||||||
stream.opaque = bz2;
|
|
||||||
if (bsdiff(old, oldsize, new, newsize, &stream))
|
|
||||||
err(1, "bsdiff");
|
|
||||||
|
|
||||||
BZ2_bzWriteClose(&bz2err, bz2, 0, NULL, NULL);
|
|
||||||
if (bz2err != BZ_OK)
|
|
||||||
err(1, "BZ2_bzWriteClose, bz2err=%d", bz2err);
|
|
||||||
|
|
||||||
if (fclose(pf))
|
|
||||||
err(1, "fclose");
|
|
||||||
|
|
||||||
/* Free the memory we used */
|
|
||||||
free(old);
|
|
||||||
free(new);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright 2003-2005 Colin Percival
|
|
||||||
* Copyright 2012 Matthew Endsley
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted providing that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef BSDIFF_H
|
|
||||||
# define BSDIFF_H
|
|
||||||
|
|
||||||
# include <stddef.h>
|
|
||||||
# include <stdint.h>
|
|
||||||
|
|
||||||
struct bsdiff_stream
|
|
||||||
{
|
|
||||||
void* opaque;
|
|
||||||
|
|
||||||
void* (*malloc)(size_t size);
|
|
||||||
void (*free)(void* ptr);
|
|
||||||
int (*write)(struct bsdiff_stream* stream, const void* buffer, int size);
|
|
||||||
};
|
|
||||||
|
|
||||||
int bsdiff(const uint8_t* old, int64_t oldsize, const uint8_t* new, int64_t newsize, struct bsdiff_stream* stream);
|
|
||||||
#endif
|
|
@ -1,41 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright 2003-2005 Colin Percival
|
|
||||||
* Copyright 2012 Matthew Endsley
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted providing that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef BSPATCH_H
|
|
||||||
# define BSPATCH_H
|
|
||||||
|
|
||||||
# include <stdint.h>
|
|
||||||
|
|
||||||
struct bspatch_stream
|
|
||||||
{
|
|
||||||
void* opaque;
|
|
||||||
int (*read)(const struct bspatch_stream* stream, void* buffer, int length);
|
|
||||||
};
|
|
||||||
|
|
||||||
int bspatch(const uint8_t* old, int64_t oldsize, uint8_t* new, int64_t newsize, struct bspatch_stream* stream);
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
|||||||
/* config.h. Generated from config.h.in by configure. */
|
|
||||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
|
||||||
#define HAVE_FCNTL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#define HAVE_INTTYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `bz2' library (-lbz2). */
|
|
||||||
#define HAVE_LIBBZ2 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <limits.h> header file. */
|
|
||||||
#define HAVE_LIMITS_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
|
||||||
to 0 otherwise. */
|
|
||||||
#define HAVE_MALLOC 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#define HAVE_MEMORY_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memset' function. */
|
|
||||||
#define HAVE_MEMSET 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stddef.h> header file. */
|
|
||||||
#define HAVE_STDDEF_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#define HAVE_STDINT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#define HAVE_STDLIB_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#define HAVE_STRINGS_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#define HAVE_STRING_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#define HAVE_SYS_STAT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#define HAVE_SYS_TYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#define HAVE_UNISTD_H 1
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#define PACKAGE "bsdiff"
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#define PACKAGE_BUGREPORT ""
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#define PACKAGE_NAME "bsdiff"
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#define PACKAGE_STRING "bsdiff 0.1"
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#define PACKAGE_TARNAME "bsdiff"
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#define PACKAGE_URL ""
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#define PACKAGE_VERSION "0.1"
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#define VERSION "0.1"
|
|
||||||
|
|
||||||
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
|
|
||||||
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
|
|
||||||
#define below would cause a syntax error. */
|
|
||||||
/* #undef _UINT8_T */
|
|
||||||
|
|
||||||
/* Define to the type of a signed integer type of width exactly 64 bits if
|
|
||||||
such a type exists and the standard includes do not define it. */
|
|
||||||
/* #undef int64_t */
|
|
||||||
|
|
||||||
/* Define to rpl_malloc if the replacement function should be used. */
|
|
||||||
/* #undef malloc */
|
|
||||||
|
|
||||||
/* Define to `long int' if <sys/types.h> does not define. */
|
|
||||||
/* #undef off_t */
|
|
||||||
|
|
||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
/* #undef size_t */
|
|
||||||
|
|
||||||
/* Define to the type of an unsigned integer type of width exactly 8 bits if
|
|
||||||
such a type exists and the standard includes do not define it. */
|
|
||||||
/* #undef uint8_t */
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue