// Path: library/src/main/java/com/jwoolston/android/uvc/interfaces/streaming/VideoFormat.java
// public class VideoFormat<T extends VideoFrame> {
// 
//     protected int     formatIndex;
//     protected int     numberFrames;
//     protected int     defaultFrameIndex;
//     protected int     aspectRatioX;
//     protected int     aspectRatioY;
//     protected byte    interlaceFlags;
//     protected boolean copyProtect;
// 
//     private VideoColorMatchingDescriptor colorMatchingDescriptor;
// 
//     protected final Set<T> videoFrames = new HashSet<>();
// 
//     VideoFormat(@NonNull byte[] descriptor) throws IllegalArgumentException {
// 
//     }
// 
//     public void setColorMatchingDescriptor(VideoColorMatchingDescriptor descriptor) {
//         colorMatchingDescriptor = descriptor;
//     }
// 
//     public VideoColorMatchingDescriptor getColorMatchingDescriptor() {
//         return colorMatchingDescriptor;
//     }
// 
//     public int getFormatIndex() {
//         return formatIndex;
//     }
// 
//     public int getNumberFrames() {
//         return numberFrames;
//     }
// 
//     public int getDefaultFrameIndex() {
//         return defaultFrameIndex;
//     }
// 
//     @NonNull
//     public Set<T> getVideoFrames() {
//         return videoFrames;
//     }
// 
//     public int getAspectRatioX() {
//         return aspectRatioX;
//     }
// 
//     public int getAspectRatioY() {
//         return aspectRatioY;
//     }
// 
//     public byte getInterlaceFlags() {
//         return interlaceFlags;
//     }
// 
//     public boolean isCopyProtect() {
//         return copyProtect;
//     }
// 
//     public VideoFrame getDefaultFrame() throws IllegalStateException {
//         for (VideoFrame frame : videoFrames) {
//             if (frame.getFrameIndex() == getDefaultFrameIndex()) {
//                 return frame;
//             }
//         }
//         throw new IllegalStateException("No default frame was found!");
//     }
// }


import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.net.Uri;
import android.support.annotation.NonNull;
import com.jwoolston.android.libusb.DevicePermissionDenied;
import com.jwoolston.android.uvc.interfaces.streaming.VideoFormat;
import java.util.List;
package com.jwoolston.android.uvc;


/**
 * @author Jared Woolston (Jared.Woolston@gmail.com)
 */
class WebcamImpl implements Webcam {

    private final Context          context;
    private final UsbDevice        device;
    private final WebcamConnection webcamConnection;

    WebcamImpl(Context context, UsbDevice device) throws UnknownDeviceException, DevicePermissionDenied {
        this.context = context;
        this.device = device;

        webcamConnection = new WebcamConnection(context.getApplicationContext(), device);
    }

    @NonNull
    @Override
    public UsbDevice getDevice() {
        return device;
    }

    @Override
    public boolean isConnected() {
        return webcamConnection.isConnected();
    }

    /**
     * Retrieves the list of available {@link VideoFormat}s.
     *
     * @return The available {@link VideoFormat}s on the device.
     */
    public List<VideoFormat> getAvailableFormats() {
        return webcamConnection.getAvailableFormats();
    }

    @NonNull
    @Override
// Path: library/src/main/java/com/jwoolston/android/uvc/interfaces/streaming/VideoFormat.java
// public class VideoFormat<T extends VideoFrame> {
// 
//     protected int     formatIndex;
//     protected int     numberFrames;
//     protected int     defaultFrameIndex;
//     protected int     aspectRatioX;
//     protected int     aspectRatioY;
//     protected byte    interlaceFlags;
//     protected boolean copyProtect;
// 
//     private VideoColorMatchingDescriptor colorMatchingDescriptor;
// 
//     protected final Set<T> videoFrames = new HashSet<>();
// 
//     VideoFormat(@NonNull byte[] descriptor) throws IllegalArgumentException {
// 
//     }
// 
//     public void setColorMatchingDescriptor(VideoColorMatchingDescriptor descriptor) {
//         colorMatchingDescriptor = descriptor;
//     }
// 
//     public VideoColorMatchingDescriptor getColorMatchingDescriptor() {
//         return colorMatchingDescriptor;
//     }
// 
//     public int getFormatIndex() {
//         return formatIndex;
//     }
// 
//     public int getNumberFrames() {
//         return numberFrames;
//     }
// 
//     public int getDefaultFrameIndex() {
//         return defaultFrameIndex;
//     }
// 
//     @NonNull
//     public Set<T> getVideoFrames() {
//         return videoFrames;
//     }
// 
//     public int getAspectRatioX() {
//         return aspectRatioX;
//     }
// 
//     public int getAspectRatioY() {
//         return aspectRatioY;
//     }
// 
//     public byte getInterlaceFlags() {
//         return interlaceFlags;
//     }
// 
//     public boolean isCopyProtect() {
//         return copyProtect;
//     }
// 
//     public VideoFrame getDefaultFrame() throws IllegalStateException {
//         for (VideoFrame frame : videoFrames) {
//             if (frame.getFrameIndex() == getDefaultFrameIndex()) {
//                 return frame;
//             }
//         }
//         throw new IllegalStateException("No default frame was found!");
//     }
// }


// Path: library/src/main/java/com/jwoolston/android/uvc/WebcamImpl.java
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.net.Uri;
import android.support.annotation.NonNull;
import com.jwoolston.android.libusb.DevicePermissionDenied;
import com.jwoolston.android.uvc.interfaces.streaming.VideoFormat;
import java.util.List;

package com.jwoolston.android.uvc;


/**
 * @author Jared Woolston (Jared.Woolston@gmail.com)
 */
class WebcamImpl implements Webcam {

    private final Context          context;
    private final UsbDevice        device;
    private final WebcamConnection webcamConnection;

    WebcamImpl(Context context, UsbDevice device) throws UnknownDeviceException, DevicePermissionDenied {
        this.context = context;
        this.device = device;

        webcamConnection = new WebcamConnection(context.getApplicationContext(), device);
    }

    @NonNull
    @Override
    public UsbDevice getDevice() {
        return device;
    }

    @Override
    public boolean isConnected() {
        return webcamConnection.isConnected();
    }

    /**
     * Retrieves the list of available {@link VideoFormat}s.
     *
     * @return The available {@link VideoFormat}s on the device.
     */
    public List<VideoFormat> getAvailableFormats() {
        return webcamConnection.getAvailableFormats();
    }

    @NonNull
    @Override
    public Uri beginStreaming(@NonNull Context context, @NonNull VideoFormat format) throws StreamCreationException {