Files
onvif-go/CAMERA_ANALYSIS.md
T
ProtoTess 3bf078ed3f Add camera test framework and initial tests for Bosch FLEXIDOME indoor 5100i IR
- Introduced a new directory `testdata/captures/` containing captured XML archives and README documentation for the camera test framework.
- Added a mock server implementation to replay captured SOAP responses for testing.
- Created automated tests for Bosch FLEXIDOME indoor 5100i IR using captured responses, validating device information, system date and time, capabilities, and profiles.
- Implemented enhanced device features tests, covering hostname, DNS, NTP, network interfaces, scopes, and user management.
- Added support for enhanced media and imaging features, including video and audio sources, and imaging options.
- Updated types to include new configurations and options for network, imaging, and device capabilities.
2025-11-11 02:10:04 +00:00

22 KiB

ONVIF Camera Analysis Report

Generated: November 7, 2025

Executive Summary

Analysis of 5 ONVIF-compliant cameras from 3 manufacturers (REOLINK, AXIS, Bosch) reveals diverse implementations and capabilities. All cameras successfully responded to ONVIF commands with varying feature sets.


Camera Inventory

  • Firmware: v3.1.0.2649_23083101
  • Serial: 192168261
  • IP: 192.168.2.61:8000
  • Type: PTZ Indoor Camera
  • Key Features: PTZ support, dual stream, basic imaging

2. AXIS Q3819-PVE

  • Firmware: 10.12.153
  • Serial: B8A44F9DC7ED
  • IP: 192.168.2.190
  • Type: Panoramic Fixed Dome
  • Key Features: Ultra-wide 8192x1728 resolution, analytics, advanced imaging

3. AXIS P3818-PVE

  • Firmware: 11.9.60
  • Serial: B8A44FA04F26
  • IP: 192.168.2.82
  • Type: Panoramic Fixed Dome
  • Key Features: 5120x2560 resolution, analytics, dual encoding (H264/JPEG)

4. Bosch FLEXIDOME panoramic 5100i

  • Firmware: 9.00.0210
  • Serial: 404705923918060213
  • IP: 192.168.2.24
  • Type: 360° Panoramic Dome
  • Key Features: 16 profiles, dewarping, circular image (2112x2112)

5. Bosch FLEXIDOME IP starlight 8000i

  • Firmware: 7.70.0126
  • Serial: 044518807925140011
  • IP: 192.168.2.200
  • Type: Fixed Dome with Low-Light Performance
  • Key Features: Starlight imaging, I/O connectors, relay output

Comparative Analysis

Resolution Capabilities

Camera Max Resolution Aspect Ratio Primary Use Case
REOLINK E1 Zoom 2048x1536 4:3 Standard surveillance
AXIS Q3819-PVE 8192x1728 ~4.7:1 180° panoramic
AXIS P3818-PVE 5120x2560 2:1 180° panoramic
Bosch panoramic 5100i 2112x2112 1:1 360° fisheye
Bosch starlight 8000i 1536x864 16:9 Low-light environments

Profile Count

Camera Total Profiles Video Profiles Notes
REOLINK E1 Zoom 2 2 MainStream + SubStream
AXIS Q3819-PVE 2 2 H264 + JPEG
AXIS P3818-PVE 2 2 H264 + JPEG
Bosch panoramic 5100i 16 9 valid Includes metadata/audio profiles
Bosch starlight 8000i 3 3 2x H264 + 1x JPEG

ONVIF Service Support

Service REOLINK AXIS Q3819 AXIS P3818 Bosch Panoramic Bosch Starlight
Device
Media
Imaging
Events
Analytics
PTZ

Video Encoding

Camera H264 JPEG MPEG4 Notes
REOLINK H264 only
AXIS Q3819 Dual encoding
AXIS P3818 Dual encoding
Bosch Panoramic H264 only
Bosch Starlight Dual encoding

Network Capabilities

Feature REOLINK AXIS Q3819 AXIS P3818 Bosch Panoramic Bosch Starlight
RTP Multicast
RTP/TCP
RTP/RTSP/TCP
IPv6 Support
TLS 1.2

Imaging Features

Feature REOLINK AXIS Q3819 AXIS P3818 Bosch Panoramic Bosch Starlight
Brightness Control ✓ (128) ✓ (50) ✓ (50) ✓ (127) ✓ (128)
Saturation Control ✓ (128) ✓ (50) ✓ (50) ✓ (127) ✓ (128)
Contrast Control ✓ (128) ✓ (50) ✓ (50) ✓ (127) ✓ (128)
Sharpness Control ✓ (128) ✓ (50) ✓ (50)
IrCutFilter AUTO AUTO AUTO
WDR ON ON
WhiteBalance AUTO AUTO
Exposure Control AUTO AUTO

I/O and Security

Feature REOLINK AXIS Q3819 AXIS P3818 Bosch Panoramic Bosch Starlight
Input Connectors 0 2 2 0 2
Relay Outputs 0 0 0 0 1
IP Filter
TLS 1.1
TLS 1.2

Manufacturer-Specific Findings

  • Strengths:
    • Simple, straightforward ONVIF implementation
    • PTZ support with status reporting
    • Good value camera with basic features
  • Limitations:
    • Limited imaging controls (no WDR, exposure, focus)
    • Only H264 encoding (no JPEG profile)
    • No analytics support
    • Lower security features (no TLS)
  • RTSP Pattern: rtsp://IP:554/ (main), rtsp://IP:554/h264Preview_01_sub (sub)
  • Snapshot Pattern: http://IP:80/cgi-bin/api.cgi?cmd=onvifSnapPic&channel=0

AXIS

  • Strengths:
    • Excellent ONVIF compliance and feature richness
    • Ultra-high resolution panoramic cameras
    • Advanced imaging with WDR, exposure control, white balance
    • Strong security (TLS 1.1/1.2, IP filtering, access policy)
    • Analytics and rule-based event support
  • Consistent Implementation:
    • Both cameras share similar ONVIF structure
    • Dual H264/JPEG encoding profiles
    • Same URL patterns and capabilities
  • RTSP Pattern: rtsp://IP/onvif-media/media.amp?profile=X&sessiontimeout=60&streamtype=unicast
  • Snapshot Pattern: http://IP/onvif-cgi/jpg/image.cgi?resolution=WxH&compression=30
  • Notable: Q3819 has wider aspect ratio (8192x1728 vs 5120x2560)

Bosch

  • Strengths:
    • Specialized cameras with unique features
    • Panoramic 5100i has comprehensive dewarping profiles
    • Starlight 8000i optimized for low-light
    • Good I/O options (starlight model has relay output)
  • Quirks:
    • Panoramic model has 16 profiles (many without video encoders)
    • Some profiles return "IncompleteConfiguration" errors
    • Less standardized RTSP URLs (tunnel-based)
  • RTSP Pattern: rtsp://IP/rtsp_tunnel?p=X&line=Y&inst=Z (various parameters)
  • Snapshot Pattern: http://IP/snap.jpg?JpegCam=X
  • Notable:
    • Panoramic uses circular (2112x2112) and dewarped (3072x1728) views
    • 3 profiles failed GetStreamURI with incomplete configuration

Performance Metrics

Response Times (Average)

Operation REOLINK AXIS Q3819 AXIS P3818 Bosch Panoramic Bosch Starlight
DeviceInfo 117.7ms 5.0ms 4.9ms 8.5ms 7.9ms
Capabilities 85.6ms 72.7ms 69.3ms 21.9ms 27.1ms
GetProfiles 832.1ms 70.9ms 8.0ms 706.2ms 258.3ms
GetStreamURI ~129ms avg ~20ms avg ~4ms avg ~11ms avg ~10ms avg
GetSnapshot ~170ms avg ~20ms avg ~4ms avg ~11ms avg ~6ms avg
Imaging 111.8ms 55.8ms 67.2ms 57.3ms 14.8ms

Key Observations:

  • AXIS cameras have fastest response times overall
  • REOLINK has higher latency (likely due to port 8000, may be proxy/gateway)
  • Bosch cameras have moderate, consistent response times
  • GetProfiles is slowest operation for most cameras

Error Analysis

Camera Total Errors Error Types
REOLINK E1 Zoom 0 None
AXIS Q3819-PVE 0 None
AXIS P3818-PVE 0 None
Bosch panoramic 5100i 3 GetStreamURI: IncompleteConfiguration (profiles 9,10,11)
Bosch starlight 8000i 0 None

Bosch Panoramic Errors: Profiles 9, 10, 11 have no VideoEncoderConfiguration, causing legitimate failures. These appear to be metadata-only or incomplete profiles.


Stream URI Patterns

rtsp://192.168.2.61:554/                           # MainStream
rtsp://192.168.2.61:554/h264Preview_01_sub         # SubStream

AXIS Pattern

rtsp://IP/onvif-media/media.amp?profile=profile_1_h264&sessiontimeout=60&streamtype=unicast
rtsp://IP/onvif-media/media.amp?profile=profile_1_jpeg&sessiontimeout=60&streamtype=unicast

Bosch Patterns

Indoor 5100i IR (from previous report):

rtsp://IP/rtsp_tunnel?p=0&line=1&inst=1&vcd=2

Panoramic 5100i:

rtsp://192.168.2.24/rtsp_tunnel?p=0&line=3&inst=4     # E_PTZ view
rtsp://192.168.2.24/rtsp_tunnel?p=1&line=2&inst=1     # Dewarped view
rtsp://192.168.2.24/rtsp_tunnel?p=2&line=1&inst=4     # Full circle
rtsp://192.168.2.24/rtsp_tunnel?von=0&aon=1&aud=1     # Audio only
rtsp://192.168.2.24/rtsp_tunnel?von=0&vcd=2&line=1    # Metadata

Starlight 8000i:

rtsp://192.168.2.200/rtsp_tunnel?p=0&h26x=4&vcd=2
rtsp://192.168.2.200/rtsp_tunnel?p=1&inst=2&h26x=4
rtsp://192.168.2.200/rtsp_tunnel?h26x=0               # JPEG

Parameter Meanings:

  • p: Profile index
  • line: Video line/source (1=full, 2=dewarped, 3=ePTZ)
  • inst: Instance number
  • vcd: Video codec (2=metadata)
  • h26x: H.26x codec (0=JPEG, 4=H264)
  • von: Video on/off
  • aon: Audio on/off

PTZ Capabilities

  • PTZ Service: http://192.168.2.61:8000/onvif/ptz_service
  • Status: Both profiles report IDLE for PanTilt and Zoom
  • Presets: 0 configured
  • Configuration: PTZ config present but with empty position spaces
  • Notes: PTZ capability exists but requires further testing for movement commands

Bosch Panoramic 5100i (ePTZ)

  • PTZ Service: http://192.168.2.24/onvif/ptz_service
  • Type: Electronic PTZ (digital zoom/pan on panoramic image)
  • Profile: Dedicated ePTZ profile (token "0", 1920x1080)
  • Notes: Digital PTZ on dewarped 360° image, not mechanical movement

Other Cameras

  • AXIS Q3819-PVE, P3818-PVE, Bosch starlight 8000i: No PTZ support

Snapshot URI Patterns

Manufacturer Pattern Authentication Required
REOLINK http://IP:80/cgi-bin/api.cgi?cmd=onvifSnapPic&channel=0 Yes
AXIS http://IP/onvif-cgi/jpg/image.cgi?resolution=WxH&compression=30 Yes
Bosch http://IP/snap.jpg?JpegCam=N Yes

InvalidAfterConnect/Reboot:

  • REOLINK: InvalidAfterConnect=true, InvalidAfterReboot=true
  • AXIS: All false (persistent URIs)
  • Bosch: InvalidAfterReboot=true

Bitrate and Frame Rate Analysis

  • MainStream: 1024 kbps @ 15fps (2048x1536)
  • SubStream: 512 kbps @ 15fps (640x480)
  • Quality: 0 (main), 2 (sub)

AXIS Q3819-PVE

  • H264: Max bitrate @ 30fps (8192x1728)
  • JPEG: Max bitrate @ 30fps (8192x1728)
  • Quality: 70 for both
  • Bitrate Limit: 2147483647 (max int32 = unlimited)

AXIS P3818-PVE

  • H264: Max bitrate @ 30fps (1920x960)
  • JPEG: Max bitrate @ 30fps (5120x2560)
  • Quality: 70 for both
  • Bitrate Limit: 2147483647 (unlimited)

Bosch Panoramic 5100i

  • Highest: 13000 kbps @ 30fps (3072x1728 dewarped)
  • Lowest: 400 kbps @ 30fps (512x288)
  • Standard: 5200 kbps @ 30fps (1920x1080)
  • Quality: 50 across all profiles

Bosch Starlight 8000i

  • H264: 1400 kbps @ 30fps (1536x864)
  • JPEG: 6000 kbps @ 1fps (1536x864)
  • Quality: 50 (H264), 70 (JPEG)

Testing Recommendations

Priority 1: Create Camera-Specific Tests

Each manufacturer has distinct patterns worthy of dedicated test files:

  1. reolink_e1_zoom_test.go

    • Test PTZ status retrieval
    • Verify dual-stream profiles
    • Test CGI-based snapshot URLs
    • Validate 15fps frame rate limits
  2. axis_q3819_test.go

    • Test ultra-wide resolution (8192x1728)
    • Verify analytics service
    • Test dual H264/JPEG encoding
    • Validate WDR and exposure settings
    • Test multicast support
  3. axis_p3818_test.go

    • Test 5120x2560 panoramic resolution
    • Similar to Q3819 but different aspect ratio
    • Benchmark performance differences
  4. bosch_panoramic_5100i_test.go

    • Test circular (2112x2112) image profiles
    • Test dewarped profiles
    • Handle IncompleteConfiguration errors gracefully
    • Test metadata and audio-only profiles
    • Test 16 different profiles
  5. bosch_starlight_8000i_test.go

    • Test low-light imaging capabilities
    • Test I/O connectors (2 inputs, 1 relay output)
    • Test JPEG motion (1fps) vs H264 (30fps)

Priority 2: Cross-Manufacturer Tests

Create tests that verify common ONVIF compliance:

  1. stream_uri_compatibility_test.go

    • Parse and validate different RTSP URL formats
    • Test RTSP connection to each pattern
    • Verify authentication handling
  2. imaging_settings_test.go

    • Test brightness/contrast/saturation ranges
    • Test optional features (WDR, exposure, white balance)
    • Verify manufacturer-specific defaults
  3. profile_enumeration_test.go

    • Test handling of 2-16 profiles
    • Verify profile names and tokens
    • Test resolution validation

Priority 3: Edge Case Tests

  1. incomplete_profile_handling_test.go

    • Test cameras with profiles lacking video encoders
    • Verify graceful error handling for IncompleteConfiguration
    • Test metadata-only and audio-only profiles
  2. performance_benchmark_test.go

    • Benchmark GetProfiles (100ms to 800ms variation)
    • Test response time consistency
    • Measure concurrent request handling

Code Patterns for Tests

Example: Testing AXIS Cameras

func TestAXISQ3819PVE_UltraWideResolution(t *testing.T) {
    skipIfNoCamera(t)
    
    client := createTestClient(t)
    profiles, err := client.GetProfiles()
    require.NoError(t, err)
    
    // AXIS Q3819 should have H264 and JPEG profiles
    assert.Equal(t, 2, len(profiles))
    
    // Find H264 profile
    var h264Profile *onvif.Profile
    for _, p := range profiles {
        if p.VideoEncoderConfiguration != nil && 
           p.VideoEncoderConfiguration.Encoding == "H264" {
            h264Profile = &p
            break
        }
    }
    
    require.NotNil(t, h264Profile, "H264 profile should exist")
    
    // Verify ultra-wide resolution
    assert.Equal(t, 8192, h264Profile.VideoEncoderConfiguration.Resolution.Width)
    assert.Equal(t, 1728, h264Profile.VideoEncoderConfiguration.Resolution.Height)
    
    // Verify 30fps
    assert.Equal(t, 30, h264Profile.VideoEncoderConfiguration.RateControl.FrameRateLimit)
}

Example: Testing Bosch Panoramic Profiles

func TestBoschPanoramic5100i_MultipleProfiles(t *testing.T) {
    skipIfNoCamera(t)
    
    client := createTestClient(t)
    profiles, err := client.GetProfiles()
    require.NoError(t, err)
    
    // Should have 16 profiles
    assert.Equal(t, 16, len(profiles))
    
    // Count profiles with valid video encoders
    validVideoProfiles := 0
    for _, p := range profiles {
        if p.VideoEncoderConfiguration != nil {
            validVideoProfiles++
        }
    }
    
    assert.Equal(t, 9, validVideoProfiles, "Should have 9 video profiles")
    
    // Test that incomplete profiles fail gracefully
    for _, p := range profiles {
        uri, err := client.GetStreamURI(p.Token, "RTP-Unicast")
        
        if p.VideoEncoderConfiguration != nil {
            // Valid profiles should succeed
            if err != nil {
                t.Logf("Profile %s failed: %v", p.Token, err)
            }
        } else {
            // Incomplete profiles should fail
            assert.Error(t, err, "Profile %s should fail (no video encoder)", p.Token)
        }
    }
}

Example: Testing PTZ Status

func TestREOLINKE1Zoom_PTZStatus(t *testing.T) {
    skipIfNoCamera(t)
    
    client := createTestClient(t)
    profiles, err := client.GetProfiles()
    require.NoError(t, err)
    
    for _, profile := range profiles {
        if profile.PTZConfiguration != nil {
            status, err := client.GetPTZStatus(profile.Token)
            require.NoError(t, err)
            
            // Should report IDLE when not moving
            assert.NotNil(t, status.MoveStatus)
            assert.Contains(t, []string{"IDLE", "MOVING"}, status.MoveStatus.PanTilt)
            assert.Contains(t, []string{"IDLE", "MOVING"}, status.MoveStatus.Zoom)
        }
    }
}

Integration Test Suite Structure

tests/
├── manufacturers/
│   ├── reolink/
│   │   └── e1_zoom_test.go
│   ├── axis/
│   │   ├── q3819_pve_test.go
│   │   └── p3818_pve_test.go
│   └── bosch/
│       ├── flexidome_indoor_5100i_ir_test.go (existing)
│       ├── flexidome_panoramic_5100i_test.go
│       └── flexidome_starlight_8000i_test.go
├── compliance/
│   ├── stream_uri_test.go
│   ├── imaging_test.go
│   └── profile_test.go
├── benchmarks/
│   └── response_time_test.go
└── edge_cases/
    ├── incomplete_profiles_test.go
    └── error_handling_test.go

Implementation Insights

RTSP Tunnel Parameters (Bosch)

Bosch uses a proprietary rtsp_tunnel endpoint with various parameters:

  • p: Profile index (0-15)
  • line: Video source line
    • 1 = Full image circle
    • 2 = Dewarped view mode
    • 3 = Electronic PTZ
  • inst: Stream instance (1-4, corresponds to bitrate tiers)
  • h26x: Codec selection
    • 0 = JPEG
    • 4 = H.264
  • vcd: Video coding
    • 2 = Metadata stream
  • von: Video on (0/1)
  • aon: Audio on (0/1)
  • aud: Audio stream identifier
  • JpegCam: Camera number for snapshots

AXIS URL Parameters

  • profile: Profile token
  • sessiontimeout: Session timeout in seconds
  • streamtype: unicast or multicast
  • resolution: Snapshot resolution (WxH)
  • compression: JPEG compression quality (0-100, lower = better)

Uses proprietary CGI commands:

  • cmd=onvifSnapPic: Get ONVIF-compliant snapshot
  • channel=0: Camera channel

Security Considerations

Authentication

All cameras require HTTP Digest Authentication for ONVIF requests.

TLS Support

Camera TLS 1.1 TLS 1.2 Notes
REOLINK E1 Zoom HTTP only
AXIS Q3819-PVE Full TLS support
AXIS P3818-PVE Full TLS support
Bosch Panoramic 5100i TLS 1.2 only
Bosch Starlight 8000i Full TLS support

Recommendation: AXIS cameras provide the strongest security posture with IP filtering, access policy config, and TLS support.

WS-Security

All cameras support WS-Security UsernameToken with digest authentication, as evidenced by successful ONVIF communication.


Compatibility Matrix

ONVIF Profile Compliance

Based on feature analysis, likely ONVIF profile compliance:

Camera Profile S Profile T Profile G Profile M
REOLINK E1 Zoom ✓ (PTZ)
AXIS Q3819-PVE ✓ (Analytics) ✓ (Metadata)
AXIS P3818-PVE ✓ (Analytics) ✓ (Metadata)
Bosch Panoramic 5100i ✓ (ePTZ) ✓ (Analytics) ✓ (Metadata)
Bosch Starlight 8000i Partial

Profiles:

  • S: Streaming (basic video)
  • T: PTZ control
  • G: Video analytics
  • M: Metadata streaming

Conclusions

Best Practices Discovered

  1. Profile Enumeration: Always check VideoEncoderConfiguration before calling GetStreamURI
  2. Error Handling: Bosch cameras may return IncompleteConfiguration for metadata profiles
  3. Response Times: Expect 5-800ms for GetProfiles depending on camera complexity
  4. URL Patterns: Cannot assume consistent RTSP URL format across manufacturers
  5. Imaging Defaults: Manufacturers use different scales (0-255 vs 0-100 vs 0-128)

Client Library Improvements Needed

  1. URL Parser: Helper to parse and validate different RTSP URL formats
  2. Profile Filter: Method to filter profiles by capability (video, audio, metadata)
  3. Retry Logic: Handle transient errors and timeouts
  4. TLS Support: Enable HTTPS for cameras supporting TLS
  5. Batch Operations: Parallel GetStreamURI calls for cameras with many profiles

Test Coverage Recommendations

Based on this analysis, create test files covering:

  1. Bosch FLEXIDOME indoor 5100i IR (already exists)
  2. 🔲 REOLINK E1 Zoom (PTZ, dual stream)
  3. 🔲 AXIS Q3819-PVE (ultra-wide, analytics)
  4. 🔲 AXIS P3818-PVE (panoramic, analytics)
  5. 🔲 Bosch FLEXIDOME panoramic 5100i (16 profiles, dewarping)
  6. 🔲 Bosch FLEXIDOME IP starlight 8000i (low-light, I/O)

Interoperability Score

Based on ONVIF compliance, feature richness, and ease of integration:

Camera Score Rationale
AXIS P3818-PVE 9.5/10 Excellent compliance, fast, feature-rich
AXIS Q3819-PVE 9.5/10 Same as P3818, ultra-wide resolution
Bosch Starlight 8000i 8.0/10 Good compliance, moderate features
Bosch Panoramic 5100i 7.5/10 Complex profile structure, some errors
REOLINK E1 Zoom 7.0/10 Basic features, slower responses, limited imaging

Next Steps

  1. Create manufacturer-specific test files for each camera model
  2. Implement helper functions for common patterns (URL parsing, profile filtering)
  3. Add benchmark tests to track performance regression
  4. Document manufacturer quirks in code comments
  5. Create CI/CD pipeline to test against real cameras (when available)
  6. Expand coverage for PTZ operations on REOLINK
  7. Test analytics on AXIS cameras
  8. Validate TLS connections on supported cameras

Appendix: Raw Data Summary

  • Profiles: 2
  • Stream URIs: 2/2 successful
  • Snapshot URIs: 2/2 successful
  • Video Encoders: 2/2 successful
  • Imaging Settings: 1/1 successful
  • PTZ Status: 2/2 successful (both IDLE)
  • PTZ Presets: 0
  • Total Errors: 0

AXIS Q3819-PVE

  • Profiles: 2
  • Stream URIs: 2/2 successful
  • Snapshot URIs: 2/2 successful
  • Video Encoders: 2/2 successful
  • Imaging Settings: 1/1 successful
  • Total Errors: 0

AXIS P3818-PVE

  • Profiles: 2
  • Stream URIs: 2/2 successful
  • Snapshot URIs: 2/2 successful
  • Video Encoders: 2/2 successful
  • Imaging Settings: 1/1 successful
  • Total Errors: 0

Bosch FLEXIDOME panoramic 5100i

  • Profiles: 16
  • Stream URIs: 13/16 successful (3 IncompleteConfiguration errors)
  • Snapshot URIs: 16/16 successful
  • Video Encoders: 9/9 successful (only tested valid profiles)
  • Imaging Settings: 1/1 successful
  • Total Errors: 3 (expected for incomplete profiles)

Bosch FLEXIDOME IP starlight 8000i

  • Profiles: 3
  • Stream URIs: 3/3 successful
  • Snapshot URIs: 3/3 successful
  • Video Encoders: 3/3 successful
  • Imaging Settings: 1/1 successful
  • Total Errors: 0

End of Analysis Report