1 package net.osdn.gokigen.a01d.camera.canon.wrapper.liveview;
3 import android.app.Activity;
4 import android.util.Log;
6 import androidx.annotation.NonNull;
8 import net.osdn.gokigen.a01d.camera.ILiveViewControl;
9 import net.osdn.gokigen.a01d.camera.ptpip.IPtpIpInterfaceProvider;
10 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.IPtpIpCommandPublisher;
11 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.IPtpIpCommunication;
12 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.messages.PtpIpCommandGenericWithRetry;
13 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.liveview.IPtpIpLiveViewImageCallback;
14 import net.osdn.gokigen.a01d.liveview.liveviewlistener.IImageDataReceiver;
15 import net.osdn.gokigen.a01d.liveview.liveviewlistener.ILiveViewListener;
17 import java.util.Arrays;
20 import static net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.IPtpIpMessages.SEQ_GET_VIEWFRAME;
22 public class CanonLiveViewControlPrev implements ILiveViewControl, ILiveViewListener, IPtpIpCommunication, IPtpIpLiveViewImageCallback
24 private final String TAG = this.toString();
25 private final IPtpIpCommandPublisher commandIssuer;
26 private final int delayMs;
27 private final boolean isDumpLog = false;
28 private final boolean isSearchJpegHeader;
29 private final int retryCount = 1200;
30 private final CanonLiveViewImageReceiver imageReceiver;
31 private IImageDataReceiver dataReceiver = null;
32 private boolean liveViewIsReceiving = false;
33 private boolean commandIssued = false;
35 public CanonLiveViewControlPrev(@NonNull Activity context, @NonNull IPtpIpInterfaceProvider interfaceProvider, int delayMs, boolean isSearchJpegHeader)
37 this.commandIssuer = interfaceProvider.getCommandPublisher();
38 this.isSearchJpegHeader = isSearchJpegHeader;
39 this.delayMs = delayMs;
40 this.imageReceiver = new CanonLiveViewImageReceiver(context,this);
41 Log.v(TAG, " -=-=-=-=-=- CanonLiveViewControl : delay " + delayMs + " ms");
44 public ILiveViewListener getLiveViewListener()
50 public void changeLiveViewSize(String size)
56 public void startLiveView()
58 Log.v(TAG, " startLiveView() ");
59 liveViewIsReceiving = true;
62 Thread thread = new Thread(new Runnable() {
68 while (liveViewIsReceiving)
74 Log.v(TAG, " enqueueCommand() ");
76 if (commandIssuer.getCurrentQueueSize() < 3)
79 commandIssuer.enqueueCommand(new PtpIpCommandGenericWithRetry(imageReceiver, SEQ_GET_VIEWFRAME, delayMs, retryCount, false, false, 0, 0x9153, 12, 0x00200000, 0x01, 0x00, 0x00));
84 Thread.sleep(delayMs);
107 public void stopLiveView()
109 Log.v(TAG, " stopLiveView() ");
110 liveViewIsReceiving = false;
115 public void updateDigitalZoom()
117 Log.v(TAG, " updateDigitalZoom() ");
122 public void updateMagnifyingLiveViewScale(boolean isChangeScale)
124 Log.v(TAG, " updateMagnifyingLiveViewScale() ");
128 public float getMagnifyingLiveViewScale()
134 public float getDigitalZoomScale()
140 public void setCameraLiveImageView(IImageDataReceiver target)
142 Log.v(TAG, " setCameraLiveImageView() ");
143 this.dataReceiver = target;
147 public boolean connect()
149 Log.v(TAG, " connect() ");
154 public void disconnect()
156 Log.v(TAG, " disconnect() ");
160 public void onCompleted(byte[] data, Map<String, Object> metadata)
162 //Log.v(TAG, " ---+++--- RECEIVED LV IMAGE ---+++--- ");
165 if ((dataReceiver != null)&&(data != null))
169 Log.v(TAG, " ---+++--- RECEIVED LV IMAGE ---+++--- : " + data.length + " bytes.");
171 int headerSize = searchJpegHeader(data);
174 dataReceiver.setImageData(Arrays.copyOfRange(data, headerSize, data.length), metadata); // ヘッダ部分を切り取って送る
182 commandIssued = false;
185 private int searchJpegHeader(byte[] data)
187 if (data.length <= 8)
191 if (!isSearchJpegHeader)
193 // JPEG ヘッダを探さない場合は、8バイト固定とする
198 int size = data.length - 1;
202 if ((data[index] == (byte) 0xff)&&(data[index + 1] == (byte) 0xd8))
219 public void onErrorOccurred(Exception e)
221 Log.v(TAG, " onErrorOccurred () : " + e.getLocalizedMessage());
222 commandIssued = false;