[{"id":11884,"web_url":"https://patchwork.libcamera.org/comment/11884/","msgid":"<20200805134913.GE6751@pendragon.ideasonboard.com>","date":"2020-08-05T13:49:13","subject":"Re: [libcamera-devel] [PATCH v8 8/9] libcamera: camera: Rename\n\tname() to id()","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Wed, Aug 05, 2020 at 12:48:59PM +0200, Niklas Söderlund wrote:\n> Rename Camera::name() to camera::id() to better describe what it\n> represents, a unique and stable ID for the camera. While at it improve\n> the documentation for the camera ID to describe it needs to be stable\n> for a camera between resets of the system.\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> * Changes since v7\n> - Update two missed name -> id conversions\n> - Expand documentation for ID, thanks Laurent!\n> - Add todo in DNG writer to not forget to use real model information\n>   when it becomes available.\n> ---\n>  include/libcamera/camera.h                    |  6 +--\n>  src/android/camera_device.cpp                 |  4 +-\n>  src/cam/main.cpp                              | 10 ++--\n>  src/gstreamer/gstlibcameraprovider.cpp        |  4 +-\n>  src/gstreamer/gstlibcamerasrc.cpp             |  6 +--\n>  src/libcamera/camera.cpp                      | 51 +++++++++++++------\n>  src/libcamera/camera_controls.cpp             |  2 +-\n>  src/libcamera/camera_manager.cpp              | 16 +++---\n>  src/libcamera/framebuffer_allocator.cpp       |  2 +-\n>  src/libcamera/pipeline/ipu3/ipu3.cpp          |  5 +-\n>  .../pipeline/raspberrypi/raspberrypi.cpp      |  4 +-\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp      | 14 ++---\n>  src/qcam/dng_writer.cpp                       |  5 +-\n>  src/qcam/main_window.cpp                      | 26 +++++-----\n>  src/v4l2/v4l2_camera_proxy.cpp                |  2 +-\n>  test/pipeline/ipu3/ipu3_pipeline_test.cpp     |  2 +-\n>  test/pipeline/rkisp1/rkisp1_pipeline_test.cpp |  2 +-\n>  17 files changed, 91 insertions(+), 70 deletions(-)\n> \n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index 7dd23d75864ef2db..48d88d64a0a94050 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -71,13 +71,13 @@ class Camera final : public Object, public std::enable_shared_from_this<Camera>\n>  {\n>  public:\n>  \tstatic std::shared_ptr<Camera> create(PipelineHandler *pipe,\n> -\t\t\t\t\t      const std::string &name,\n> +\t\t\t\t\t      const std::string &id,\n>  \t\t\t\t\t      const std::set<Stream *> &streams);\n>  \n>  \tCamera(const Camera &) = delete;\n>  \tCamera &operator=(const Camera &) = delete;\n>  \n> -\tconst std::string &name() const;\n> +\tconst std::string &id() const;\n>  \n>  \tSignal<Request *, FrameBuffer *> bufferCompleted;\n>  \tSignal<Request *> requestCompleted;\n> @@ -100,7 +100,7 @@ public:\n>  \tint stop();\n>  \n>  private:\n> -\tCamera(PipelineHandler *pipe, const std::string &name,\n> +\tCamera(PipelineHandler *pipe, const std::string &id,\n>  \t       const std::set<Stream *> &streams);\n>  \t~Camera();\n>  \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index b5206fd623c62b23..c74e8a6e84251838 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -1072,7 +1072,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>  \tint ret = camera_->configure(config_.get());\n>  \tif (ret) {\n>  \t\tLOG(HAL, Error) << \"Failed to configure camera '\"\n> -\t\t\t\t<< camera_->name() << \"'\";\n> +\t\t\t\t<< camera_->id() << \"'\";\n>  \t\treturn ret;\n>  \t}\n>  \n> @@ -1240,7 +1240,7 @@ void CameraDevice::requestComplete(Request *request)\n>  \n>  std::string CameraDevice::logPrefix() const\n>  {\n> -\treturn \"'\" + camera_->name() + \"'\";\n> +\treturn \"'\" + camera_->id() + \"'\";\n>  }\n>  \n>  void CameraDevice::notifyShutter(uint32_t frameNumber, uint64_t timestamp)\n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index ec59e9eaf1176a94..dfd0e68aa631b5c9 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -118,7 +118,7 @@ int CamApp::init(int argc, char **argv)\n>  \t\t\treturn -EINVAL;\n>  \t\t}\n>  \n> -\t\tstd::cout << \"Using camera \" << camera_->name() << std::endl;\n> +\t\tstd::cout << \"Using camera \" << camera_->id() << std::endl;\n>  \n>  \t\tret = prepareConfig();\n>  \t\tif (ret)\n> @@ -173,7 +173,7 @@ int CamApp::parseOptions(int argc, char *argv[])\n>  \n>  \tOptionsParser parser;\n>  \tparser.addOption(OptCamera, OptionString,\n> -\t\t\t \"Specify which camera to operate on, by name or by index\", \"camera\",\n> +\t\t\t \"Specify which camera to operate on, by id or by index\", \"camera\",\n>  \t\t\t ArgumentRequired, \"camera\");\n>  \tparser.addOption(OptCapture, OptionInteger,\n>  \t\t\t \"Capture until interrupted by user or until <count> frames captured\",\n> @@ -322,12 +322,12 @@ int CamApp::infoConfiguration()\n>  \n>  void CamApp::cameraAdded(std::shared_ptr<Camera> cam)\n>  {\n> -\tstd::cout << \"Camera Added: \" << cam->name() << std::endl;\n> +\tstd::cout << \"Camera Added: \" << cam->id() << std::endl;\n>  }\n>  \n>  void CamApp::cameraRemoved(std::shared_ptr<Camera> cam)\n>  {\n> -\tstd::cout << \"Camera Removed: \" << cam->name() << std::endl;\n> +\tstd::cout << \"Camera Removed: \" << cam->id() << std::endl;\n>  }\n>  \n>  int CamApp::run()\n> @@ -339,7 +339,7 @@ int CamApp::run()\n>  \n>  \t\tunsigned int index = 1;\n>  \t\tfor (const std::shared_ptr<Camera> &cam : cm_->cameras()) {\n> -\t\t\tstd::cout << index << \": \" << cam->name() << std::endl;\n> +\t\t\tstd::cout << index << \": \" << cam->id() << std::endl;\n>  \t\t\tindex++;\n>  \t\t}\n>  \t}\n> diff --git a/src/gstreamer/gstlibcameraprovider.cpp b/src/gstreamer/gstlibcameraprovider.cpp\n> index 914ed4fb1612b8c9..840e87a3d8daeae4 100644\n> --- a/src/gstreamer/gstlibcameraprovider.cpp\n> +++ b/src/gstreamer/gstlibcameraprovider.cpp\n> @@ -127,7 +127,7 @@ static GstDevice *\n>  gst_libcamera_device_new(const std::shared_ptr<Camera> &camera)\n>  {\n>  \tg_autoptr(GstCaps) caps = gst_caps_new_empty();\n> -\tconst gchar *name = camera->name().c_str();\n> +\tconst gchar *name = camera->id().c_str();\n>  \tStreamRoles roles;\n>  \n>  \troles.push_back(StreamRole::VideoRecording);\n> @@ -189,7 +189,7 @@ gst_libcamera_provider_probe(GstDeviceProvider *provider)\n>  \t}\n>  \n>  \tfor (const std::shared_ptr<Camera> &camera : cm->cameras()) {\n> -\t\tGST_INFO_OBJECT(self, \"Found camera '%s'\", camera->name().c_str());\n> +\t\tGST_INFO_OBJECT(self, \"Found camera '%s'\", camera->id().c_str());\n>  \t\tdevices = g_list_append(devices,\n>  \t\t\t\t\tg_object_ref_sink(gst_libcamera_device_new(camera)));\n>  \t}\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index 9755922ad59b22f6..0c28ae3f28529df2 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -241,12 +241,12 @@ gst_libcamera_src_open(GstLibcameraSrc *self)\n>  \t\tcam = cm->cameras()[0];\n>  \t}\n>  \n> -\tGST_INFO_OBJECT(self, \"Using camera named '%s'\", cam->name().c_str());\n> +\tGST_INFO_OBJECT(self, \"Using camera '%s'\", cam->id().c_str());\n>  \n>  \tret = cam->acquire();\n>  \tif (ret) {\n>  \t\tGST_ELEMENT_ERROR(self, RESOURCE, BUSY,\n> -\t\t\t\t  (\"Camera name '%s' is already in use.\", cam->name().c_str()),\n> +\t\t\t\t  (\"Camera '%s' is already in use.\", cam->id().c_str()),\n>  \t\t\t\t  (\"libcamera::Camera::acquire() failed: %s\", g_strerror(ret)));\n>  \t\treturn false;\n>  \t}\n> @@ -495,7 +495,7 @@ gst_libcamera_src_close(GstLibcameraSrc *self)\n>  \tret = state->cam_->release();\n>  \tif (ret) {\n>  \t\tGST_ELEMENT_WARNING(self, RESOURCE, BUSY,\n> -\t\t\t\t    (\"Camera name '%s' is still in use.\", state->cam_->name().c_str()),\n> +\t\t\t\t    (\"Camera '%s' is still in use.\", state->cam_->id().c_str()),\n>  \t\t\t\t    (\"libcamera::Camera.release() failed: %s\", g_strerror(-ret)));\n>  \t}\n>  \n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 99cb5048ee06e3d3..1e9ca1ebdfcbca7c 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -265,7 +265,7 @@ public:\n>  \t\tCameraRunning,\n>  \t};\n>  \n> -\tPrivate(PipelineHandler *pipe, const std::string &name,\n> +\tPrivate(PipelineHandler *pipe, const std::string &id,\n>  \t\tconst std::set<Stream *> &streams);\n>  \t~Private();\n>  \n> @@ -277,7 +277,7 @@ public:\n>  \tvoid setState(State state);\n>  \n>  \tstd::shared_ptr<PipelineHandler> pipe_;\n> -\tstd::string name_;\n> +\tstd::string id_;\n>  \tstd::set<Stream *> streams_;\n>  \tstd::set<Stream *> activeStreams_;\n>  \n> @@ -286,9 +286,9 @@ private:\n>  \tstd::atomic<State> state_;\n>  };\n>  \n> -Camera::Private::Private(PipelineHandler *pipe, const std::string &name,\n> +Camera::Private::Private(PipelineHandler *pipe, const std::string &id,\n>  \t\t\t const std::set<Stream *> &streams)\n> -\t: pipe_(pipe->shared_from_this()), name_(name), streams_(streams),\n> +\t: pipe_(pipe->shared_from_this()), id_(id), streams_(streams),\n>  \t  disconnected_(false), state_(CameraAvailable)\n>  {\n>  }\n> @@ -450,15 +450,21 @@ void Camera::Private::setState(State state)\n>  /**\n>   * \\brief Create a camera instance\n>   * \\param[in] pipe The pipeline handler responsible for the camera device\n> - * \\param[in] name The name of the camera device\n> + * \\param[in] id The ID of the camera device\n>   * \\param[in] streams Array of streams the camera provides\n>   *\n> - * The caller is responsible for guaranteeing unicity of the camera name.\n> + * The caller is responsible for guaranteeing a stable and unique camera ID\n> + * matching the constraints described by Camera::id(). Parameters that are\n> + * allocated dynamically at system startup, such as bus numbers that may be\n> + * enumerated differently, aretherefore not suitable to use in the ID.\n\ns/aretherefore/are therefore/\n\n> + *\n> + * Pipeline handlers that use a CameraSensor may use the CameraSensor::id() to\n> + * generate an ID that satisfies the criteria of a stable and unique camera ID.\n>   *\n>   * \\return A shared pointer to the newly created camera object\n>   */\n>  std::shared_ptr<Camera> Camera::create(PipelineHandler *pipe,\n> -\t\t\t\t       const std::string &name,\n> +\t\t\t\t       const std::string &id,\n>  \t\t\t\t       const std::set<Stream *> &streams)\n>  {\n>  \tstruct Deleter : std::default_delete<Camera> {\n> @@ -468,19 +474,34 @@ std::shared_ptr<Camera> Camera::create(PipelineHandler *pipe,\n>  \t\t}\n>  \t};\n>  \n> -\tCamera *camera = new Camera(pipe, name, streams);\n> +\tCamera *camera = new Camera(pipe, id, streams);\n>  \n>  \treturn std::shared_ptr<Camera>(camera, Deleter());\n>  }\n>  \n>  /**\n> - * \\brief Retrieve the name of the camera\n> + * \\brief Retrieve the ID of the camera\n> + *\n> + * The camera ID is a free-form string that identifies a camera in the system.\n> + * IDs are guaranteed to be unique and stable: the same camera, when connected\n> + * to the system in the same way (e.g. in the same USB port), will have the same\n> + * ID across both unplug/replug and system reboots.\n> + *\n> + * Applications may store the camera ID and use it later to acquire the same\n> + * camera. They shall treat the ID as an opaque identifier, without interpreting\n> + * its value.\n> + *\n> + * Camera IDs may change when the system hardware or firmware is modified, for\n> + * instance when replacing a PCI USB controller or moving it to another PCI\n> + * slot, or updating the ACPI tables or Device Tree.\n> + *\n>   * \\context This function is \\threadsafe.\n> - * \\return Name of the camera device\n> + *\n> + * \\return ID of the camera device\n>   */\n> -const std::string &Camera::name() const\n> +const std::string &Camera::id() const\n>  {\n> -\treturn p_->name_;\n> +\treturn p_->id_;\n>  }\n>  \n>  /**\n> @@ -506,9 +527,9 @@ const std::string &Camera::name() const\n>   * application API calls by returning errors immediately.\n>   */\n>  \n> -Camera::Camera(PipelineHandler *pipe, const std::string &name,\n> +Camera::Camera(PipelineHandler *pipe, const std::string &id,\n>  \t       const std::set<Stream *> &streams)\n> -\t: p_(new Private(pipe, name, streams))\n> +\t: p_(new Private(pipe, id, streams))\n>  {\n>  }\n>  \n> @@ -530,7 +551,7 @@ Camera::~Camera()\n>   */\n>  void Camera::disconnect()\n>  {\n> -\tLOG(Camera, Debug) << \"Disconnecting camera \" << name();\n> +\tLOG(Camera, Debug) << \"Disconnecting camera \" << id();\n>  \n>  \tp_->disconnect();\n>  \tdisconnected.emit(this);\n> diff --git a/src/libcamera/camera_controls.cpp b/src/libcamera/camera_controls.cpp\n> index 371f6d079e2d877c..cabdcf75c223fc3e 100644\n> --- a/src/libcamera/camera_controls.cpp\n> +++ b/src/libcamera/camera_controls.cpp\n> @@ -36,7 +36,7 @@ CameraControlValidator::CameraControlValidator(Camera *camera)\n>  \n>  const std::string &CameraControlValidator::name() const\n>  {\n> -\treturn camera_->name();\n> +\treturn camera_->id();\n>  }\n>  \n>  /**\n> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> index c45bf33fdc1ef01b..76543b6aac8df9c4 100644\n> --- a/src/libcamera/camera_manager.cpp\n> +++ b/src/libcamera/camera_manager.cpp\n> @@ -181,10 +181,10 @@ void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\n>  \tMutexLocker locker(mutex_);\n>  \n>  \tfor (std::shared_ptr<Camera> c : cameras_) {\n> -\t\tif (c->name() == camera->name()) {\n> +\t\tif (c->id() == camera->id()) {\n>  \t\t\tLOG(Camera, Warning)\n> -\t\t\t\t<< \"Registering camera with duplicate name '\"\n> -\t\t\t\t<< camera->name() << \"'\";\n> +\t\t\t\t<< \"Registering camera with duplicate ID '\"\n> +\t\t\t\t<< camera->id() << \"'\";\n>  \t\t\tbreak;\n>  \t\t}\n>  \t}\n> @@ -208,7 +208,7 @@ void CameraManager::Private::removeCamera(Camera *camera)\n>  \t\treturn;\n>  \n>  \tLOG(Camera, Debug)\n> -\t\t<< \"Unregistering camera '\" << camera->name() << \"'\";\n> +\t\t<< \"Unregistering camera '\" << camera->id() << \"'\";\n>  \n>  \tauto iter_d = std::find_if(camerasByDevnum_.begin(), camerasByDevnum_.end(),\n>  \t\t\t\t   [camera](const std::pair<dev_t, std::weak_ptr<Camera>> &p) {\n> @@ -329,8 +329,8 @@ std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const\n>  }\n>  \n>  /**\n> - * \\brief Get a camera based on name\n> - * \\param[in] name Name of camera to get\n> + * \\brief Get a camera based on ID\n> + * \\param[in] id ID of camera to get\n>   *\n>   * Before calling this function the caller is responsible for ensuring that\n>   * the camera manager is running.\n> @@ -339,12 +339,12 @@ std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const\n>   *\n>   * \\return Shared pointer to Camera object or nullptr if camera not found\n>   */\n> -std::shared_ptr<Camera> CameraManager::get(const std::string &name)\n> +std::shared_ptr<Camera> CameraManager::get(const std::string &id)\n>  {\n>  \tMutexLocker locker(p_->mutex_);\n>  \n>  \tfor (std::shared_ptr<Camera> camera : p_->cameras_) {\n> -\t\tif (camera->name() == name)\n> +\t\tif (camera->id() == id)\n>  \t\t\treturn camera;\n>  \t}\n>  \n> diff --git a/src/libcamera/framebuffer_allocator.cpp b/src/libcamera/framebuffer_allocator.cpp\n> index 252191ba234c5450..2fbba37a1b0b7254 100644\n> --- a/src/libcamera/framebuffer_allocator.cpp\n> +++ b/src/libcamera/framebuffer_allocator.cpp\n> @@ -95,7 +95,7 @@ int FrameBufferAllocator::allocate(Stream *stream)\n>  \tint ret = camera_->exportFrameBuffers(stream, &buffers_[stream]);\n>  \tif (ret == -EINVAL)\n>  \t\tLOG(Allocator, Error)\n> -\t\t\t<< \"Stream is not part of \" << camera_->name()\n> +\t\t\t<< \"Stream is not part of \" << camera_->id()\n>  \t\t\t<< \" active configuration\";\n>  \treturn ret;\n>  }\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index cfee178aa1bf57c2..d931ed333b4a1df6 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -629,7 +629,7 @@ int PipelineHandlerIPU3::start(Camera *camera)\n>  \n>  error:\n>  \tfreeBuffers(camera);\n> -\tLOG(IPU3, Error) << \"Failed to start camera \" << camera->name();\n> +\tLOG(IPU3, Error) << \"Failed to start camera \" << camera->id();\n>  \n>  \treturn ret;\n>  }\n> @@ -642,8 +642,7 @@ void PipelineHandlerIPU3::stop(Camera *camera)\n>  \tret |= data->imgu_->stop();\n>  \tret |= data->cio2_.stop();\n>  \tif (ret)\n> -\t\tLOG(IPU3, Warning) << \"Failed to stop camera \"\n> -\t\t\t\t   << camera->name();\n> +\t\tLOG(IPU3, Warning) << \"Failed to stop camera \" << camera->id();\n>  \n>  \tfreeBuffers(camera);\n>  }\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index c55d7325cd44d6cb..eeaf335cbcd2f93f 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -643,7 +643,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>  \tif (ret)\n>  \t\treturn ret;\n>  \n> -\tLOG(RPI, Info) << \"Sensor: \" << camera->name()\n> +\tLOG(RPI, Info) << \"Sensor: \" << camera->id()\n>  \t\t       << \" - Selected mode: \" << sensorFormat.toString();\n>  \n>  \t/*\n> @@ -793,7 +793,7 @@ int PipelineHandlerRPi::start(Camera *camera)\n>  \tret = data->ipa_->start();\n>  \tif (ret) {\n>  \t\tLOG(RPI, Error)\n> -\t\t\t<< \"Failed to start IPA for \" << camera->name();\n> +\t\t\t<< \"Failed to start IPA for \" << camera->id();\n>  \t\tstop(camera);\n>  \t\treturn ret;\n>  \t}\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 94561062c2b9d4fc..b7609cbc8f363135 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -798,7 +798,7 @@ int PipelineHandlerRkISP1::start(Camera *camera)\n>  \tif (ret) {\n>  \t\tfreeBuffers(camera);\n>  \t\tLOG(RkISP1, Error)\n> -\t\t\t<< \"Failed to start IPA \" << camera->name();\n> +\t\t\t<< \"Failed to start IPA \" << camera->id();\n>  \t\treturn ret;\n>  \t}\n>  \n> @@ -809,7 +809,7 @@ int PipelineHandlerRkISP1::start(Camera *camera)\n>  \t\tdata->ipa_->stop();\n>  \t\tfreeBuffers(camera);\n>  \t\tLOG(RkISP1, Error)\n> -\t\t\t<< \"Failed to start parameters \" << camera->name();\n> +\t\t\t<< \"Failed to start parameters \" << camera->id();\n>  \t\treturn ret;\n>  \t}\n>  \n> @@ -819,7 +819,7 @@ int PipelineHandlerRkISP1::start(Camera *camera)\n>  \t\tdata->ipa_->stop();\n>  \t\tfreeBuffers(camera);\n>  \t\tLOG(RkISP1, Error)\n> -\t\t\t<< \"Failed to start statistics \" << camera->name();\n> +\t\t\t<< \"Failed to start statistics \" << camera->id();\n>  \t\treturn ret;\n>  \t}\n>  \n> @@ -831,7 +831,7 @@ int PipelineHandlerRkISP1::start(Camera *camera)\n>  \t\tfreeBuffers(camera);\n>  \n>  \t\tLOG(RkISP1, Error)\n> -\t\t\t<< \"Failed to start camera \" << camera->name();\n> +\t\t\t<< \"Failed to start camera \" << camera->id();\n>  \t}\n>  \n>  \tactiveCamera_ = camera;\n> @@ -870,17 +870,17 @@ void PipelineHandlerRkISP1::stop(Camera *camera)\n>  \tret = video_->streamOff();\n>  \tif (ret)\n>  \t\tLOG(RkISP1, Warning)\n> -\t\t\t<< \"Failed to stop camera \" << camera->name();\n> +\t\t\t<< \"Failed to stop camera \" << camera->id();\n>  \n>  \tret = stat_->streamOff();\n>  \tif (ret)\n>  \t\tLOG(RkISP1, Warning)\n> -\t\t\t<< \"Failed to stop statistics \" << camera->name();\n> +\t\t\t<< \"Failed to stop statistics \" << camera->id();\n>  \n>  \tret = param_->streamOff();\n>  \tif (ret)\n>  \t\tLOG(RkISP1, Warning)\n> -\t\t\t<< \"Failed to stop parameters \" << camera->name();\n> +\t\t\t<< \"Failed to stop parameters \" << camera->id();\n>  \n>  \tdata->ipa_->stop();\n>  \n> diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp\n> index 8fb9681c2b4fb5e8..b5b81f0637b545af 100644\n> --- a/src/qcam/dng_writer.cpp\n> +++ b/src/qcam/dng_writer.cpp\n> @@ -386,8 +386,9 @@ int DNGWriter::write(const char *filename, const Camera *camera,\n>  \tTIFFSetField(tif, TIFFTAG_DNGBACKWARDVERSION, version);\n>  \tTIFFSetField(tif, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);\n>  \tTIFFSetField(tif, TIFFTAG_MAKE, \"libcamera\");\n> -\tTIFFSetField(tif, TIFFTAG_MODEL, camera->name().c_str());\n> -\tTIFFSetField(tif, TIFFTAG_UNIQUECAMERAMODEL, camera->name().c_str());\n> +\t/* \\todo Report a real model string instead of id. */\n> +\tTIFFSetField(tif, TIFFTAG_MODEL, camera->id().c_str());\n> +\tTIFFSetField(tif, TIFFTAG_UNIQUECAMERAMODEL, camera->id().c_str());\n>  \tTIFFSetField(tif, TIFFTAG_SOFTWARE, \"qcam\");\n>  \tTIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);\n>  \n> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> index 13a4fefe89ae7525..750353726cb16bc2 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -169,7 +169,7 @@ int MainWindow::createToolbars()\n>  \t\tthis, &MainWindow::switchCamera);\n>  \n>  \tfor (const std::shared_ptr<Camera> &cam : cm_->cameras())\n> -\t\tcameraCombo_->addItem(QString::fromStdString(cam->name()));\n> +\t\tcameraCombo_->addItem(QString::fromStdString(cam->id()));\n>  \n>  \ttoolbar_->addWidget(cameraCombo_);\n>  \n> @@ -241,11 +241,11 @@ void MainWindow::switchCamera(int index)\n>  \tconst std::shared_ptr<Camera> &cam = cameras[index];\n>  \n>  \tif (cam->acquire()) {\n> -\t\tqInfo() << \"Failed to acquire camera\" << cam->name().c_str();\n> +\t\tqInfo() << \"Failed to acquire camera\" << cam->id().c_str();\n>  \t\treturn;\n>  \t}\n>  \n> -\tqInfo() << \"Switching to camera\" << cam->name().c_str();\n> +\tqInfo() << \"Switching to camera\" << cam->id().c_str();\n>  \n>  \t/*\n>  \t * Stop the capture session, release the current camera, replace it with\n> @@ -266,19 +266,19 @@ std::string MainWindow::chooseCamera()\n>  \n>  \t/* If only one camera is available, use it automatically. */\n>  \tif (cm_->cameras().size() == 1)\n> -\t\treturn cm_->cameras()[0]->name();\n> +\t\treturn cm_->cameras()[0]->id();\n>  \n>  \t/* Present a dialog box to pick a camera. */\n>  \tfor (const std::shared_ptr<Camera> &cam : cm_->cameras())\n> -\t\tcameras.append(QString::fromStdString(cam->name()));\n> +\t\tcameras.append(QString::fromStdString(cam->id()));\n>  \n> -\tQString name = QInputDialog::getItem(this, \"Select Camera\",\n> -\t\t\t\t\t     \"Camera:\", cameras, 0,\n> -\t\t\t\t\t     false, &result);\n> +\tQString id = QInputDialog::getItem(this, \"Select Camera\",\n> +\t\t\t\t\t   \"Camera:\", cameras, 0,\n> +\t\t\t\t\t   false, &result);\n>  \tif (!result)\n>  \t\treturn std::string();\n>  \n> -\treturn name.toStdString();\n> +\treturn id.toStdString();\n>  }\n>  \n>  int MainWindow::openCamera()\n> @@ -582,7 +582,7 @@ void MainWindow::processHotplug(HotplugEvent *e)\n>  \tHotplugEvent::PlugEvent event = e->hotplugEvent();\n>  \n>  \tif (event == HotplugEvent::HotPlug) {\n> -\t\tcameraCombo_->addItem(QString::fromStdString(camera->name()));\n> +\t\tcameraCombo_->addItem(QString::fromStdString(camera->id()));\n>  \t} else if (event == HotplugEvent::HotUnplug) {\n>  \t\t/* Check if the currently-streaming camera is removed. */\n>  \t\tif (camera == camera_.get()) {\n> @@ -592,14 +592,14 @@ void MainWindow::processHotplug(HotplugEvent *e)\n>  \t\t\tcameraCombo_->setCurrentIndex(0);\n>  \t\t}\n>  \n> -\t\tint camIndex = cameraCombo_->findText(QString::fromStdString(camera->name()));\n> +\t\tint camIndex = cameraCombo_->findText(QString::fromStdString(camera->id()));\n>  \t\tcameraCombo_->removeItem(camIndex);\n>  \t}\n>  }\n>  \n>  void MainWindow::addCamera(std::shared_ptr<Camera> camera)\n>  {\n> -\tqInfo() << \"Adding new camera:\" << camera->name().c_str();\n> +\tqInfo() << \"Adding new camera:\" << camera->id().c_str();\n>  \tQCoreApplication::postEvent(this,\n>  \t\t\t\t    new HotplugEvent(std::move(camera),\n>  \t\t\t\t\t\t     HotplugEvent::HotPlug));\n> @@ -607,7 +607,7 @@ void MainWindow::addCamera(std::shared_ptr<Camera> camera)\n>  \n>  void MainWindow::removeCamera(std::shared_ptr<Camera> camera)\n>  {\n> -\tqInfo() << \"Removing camera:\" << camera->name().c_str();\n> +\tqInfo() << \"Removing camera:\" << camera->id().c_str();\n>  \tQCoreApplication::postEvent(this,\n>  \t\t\t\t    new HotplugEvent(std::move(camera),\n>  \t\t\t\t\t\t     HotplugEvent::HotUnplug));\n> diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp\n> index 50ab7e66cdc02fb1..63affaeec1b3af11 100644\n> --- a/src/v4l2/v4l2_camera_proxy.cpp\n> +++ b/src/v4l2/v4l2_camera_proxy.cpp\n> @@ -189,7 +189,7 @@ void V4L2CameraProxy::querycap(std::shared_ptr<Camera> camera)\n>  \n>  \tutils::strlcpy(reinterpret_cast<char *>(capabilities_.driver), driver.c_str(),\n>  \t\t       sizeof(capabilities_.driver));\n> -\tutils::strlcpy(reinterpret_cast<char *>(capabilities_.card), camera->name().c_str(),\n> +\tutils::strlcpy(reinterpret_cast<char *>(capabilities_.card), camera->id().c_str(),\n>  \t\t       sizeof(capabilities_.card));\n>  \tutils::strlcpy(reinterpret_cast<char *>(capabilities_.bus_info), bus_info.c_str(),\n>  \t\t       sizeof(capabilities_.bus_info));\n> diff --git a/test/pipeline/ipu3/ipu3_pipeline_test.cpp b/test/pipeline/ipu3/ipu3_pipeline_test.cpp\n> index 34998f8f6d04473f..9e647af5fdf8ee7f 100644\n> --- a/test/pipeline/ipu3/ipu3_pipeline_test.cpp\n> +++ b/test/pipeline/ipu3/ipu3_pipeline_test.cpp\n> @@ -106,7 +106,7 @@ int IPU3PipelineTest::run()\n>  {\n>  \tauto cameras = cameraManager_->cameras();\n>  \tfor (const std::shared_ptr<Camera> &cam : cameras)\n> -\t\tcout << \"Found camera '\" << cam->name() << \"'\" << endl;\n> +\t\tcout << \"Found camera '\" << cam->id() << \"'\" << endl;\n>  \n>  \tif (cameras.size() != sensors_) {\n>  \t\tcerr << cameras.size() << \" cameras registered, but \" << sensors_\n> diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp\n> index b6678ce76e9af193..acaf3c33b529d31d 100644\n> --- a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp\n> +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp\n> @@ -95,7 +95,7 @@ int RKISP1PipelineTest::run()\n>  {\n>  \tauto cameras = cameraManager_->cameras();\n>  \tfor (const std::shared_ptr<Camera> &cam : cameras)\n> -\t\tcout << \"Found camera '\" << cam->name() << \"'\" << endl;\n> +\t\tcout << \"Found camera '\" << cam->id() << \"'\" << endl;\n>  \n>  \tif (cameras.size() != sensors_) {\n>  \t\tcerr << cameras.size() << \" cameras registered, but \" << sensors_","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 60D38BD86F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  5 Aug 2020 13:49:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D43E4605AC;\n\tWed,  5 Aug 2020 15:49:26 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BA8286039D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  5 Aug 2020 15:49:25 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 245C72C0;\n\tWed,  5 Aug 2020 15:49:25 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"uEz9p+WM\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1596635365;\n\tbh=BYsu2Cm8APx73Mdxv10pIrfzFdZ/XE19cQXnXbtmER0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=uEz9p+WMPpywmy6QoxFGTug1fsC2D+wBWwHKHNkV05euUkEAFd90QGFpv9djyAxVO\n\tBB9LD/B96Q4HrwwnZml0q0q+dMsNxv94eTDzFmW6DYZukLrNKYJOWQ9pHGvI+zfnth\n\t0dGu67Gu8+2Gn/vm/HWsLZ+c9i+Z47CaA8IA49Kg=","Date":"Wed, 5 Aug 2020 16:49:13 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Message-ID":"<20200805134913.GE6751@pendragon.ideasonboard.com>","References":"<20200805104900.2172763-1-niklas.soderlund@ragnatech.se>\n\t<20200805104900.2172763-9-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200805104900.2172763-9-niklas.soderlund@ragnatech.se>","Subject":"Re: [libcamera-devel] [PATCH v8 8/9] libcamera: camera: Rename\n\tname() to id()","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]