{"action":"created","comment":{"url":"https://api.github.com/repos/NVIDIA/DALI/pulls/comments/236993556","pull_request_review_id":179184818,"id":236993556,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzNjk5MzU1Ng==","diff_hunk":"@@ -0,0 +1,219 @@\n+// Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.\n+//\n+// Licensed under the Apache License, Version 2.0 (the \"License\");\n+// you may not use this file except in compliance with the License.\n+// You may obtain a copy of the License at\n+//\n+//     http://www.apache.org/licenses/LICENSE-2.0\n+//\n+// Unless required by applicable law or agreed to in writing, software\n+// distributed under the License is distributed on an \"AS IS\" BASIS,\n+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+// See the License for the specific language governing permissions and\n+// limitations under the License.\n+\n+#ifndef DALI_PIPELINE_OPERATORS_READER_LOADER_VIDEO_LOADER_H_\n+#define DALI_PIPELINE_OPERATORS_READER_LOADER_VIDEO_LOADER_H_\n+\n+extern \"C\" {\n+#include <libavformat/avformat.h>\n+#include <libavcodec/avcodec.h>\n+}\n+\n+#include <thread>\n+#include <algorithm>\n+#include <random>\n+\n+#include \"dali/common.h\"\n+#include \"dali/pipeline/operators/reader/loader/loader.h\"\n+#include \"dali/pipeline/operators/reader/nvdecoder/nvdecoder.h\"\n+#include \"dali/pipeline/operators/reader/nvdecoder/sequencewrapper.h\"\n+#include \"dali/pipeline/operators/reader/nvdecoder/nvcuvid.h\"\n+\n+//namespace {\n+\n+// libav resource free function take the address of a pointer...\n+template<typename T>\n+class AVDeleter {\n+  public:\n+    AVDeleter() : deleter_(nullptr) {}\n+    AVDeleter(std::function<void(T**)> deleter) : deleter_{deleter} {}\n+\n+    void operator()(T *p) {\n+        deleter_(&p);\n+    }\n+  private:\n+    std::function<void(T**)> deleter_;\n+};\n+\n+// except for the old AVBitSTreamFilterContext\n+#ifndef HAVE_AVBSFCONTEXT\n+class BSFDeleter {\n+  public:\n+    void operator()(AVBitStreamFilterContext* bsf) {\n+        av_bitstream_filter_close(bsf);\n+    }\n+};\n+#endif\n+\n+template<typename T>\n+using av_unique_ptr = std::unique_ptr<T, AVDeleter<T>>;\n+\n+template<typename T>\n+av_unique_ptr<T> make_unique_av(T* raw_ptr, void (*deleter)(T**)) {\n+    return av_unique_ptr<T>(raw_ptr, AVDeleter<T>(deleter));\n+}\n+\n+// #define STRINGIFY(s) XSTRINGIFY(s)\n+// #define XSTRINGIFY(s) #s\n+// #pragma message (\"HAVE_AVSTREAM_CODECPAR=\" STRINGIFY(HAVE_AVSTREAM_CODECPAR))\n+// #pragma message (\"HAVE_AVBSFCONTEXT=\" STRINGIFY(HAVE_AVBSFCONTEXT))\n+\n+\n+namespace dali {\n+#ifdef HAVE_AVSTREAM_CODECPAR\n+auto codecpar(AVStream* stream) -> decltype(stream->codecpar);\n+#else\n+auto codecpar(AVStream* stream) -> decltype(stream->codec);\n+#endif\n+\n+struct OpenFile {\n+  bool open = false;\n+  AVRational frame_base_;\n+  AVRational stream_base_;\n+  int frame_count_;\n+\n+  int vid_stream_idx_;\n+  int last_frame_;\n+\n+#ifdef HAVE_AVBSFCONTEXT\n+  av_unique_ptr<AVBSFContext> bsf_ctx_;\n+#else\n+  using bsf_ptr = std::unique_ptr<AVBitStreamFilterContext, BSFDeleter>;\n+  bsf_ptr bsf_ctx_;\n+  AVCodecContext* codec;\n+#endif\n+  av_unique_ptr<AVFormatContext> fmt_ctx_;\n+};\n+\n+/// Provides statistics, see VideoLoader::get_stats() and VideoLoader::reset_stats()\n+struct VideoLoaderStats {\n+    /** Total number of bytes read from disk */\n+    uint64_t bytes_read;\n+\n+    /** Number of compressed packets read from disk */\n+    uint64_t packets_read;\n+\n+    /** Total number of bytes sent to NVDEC for decoding, can be\n+     *  different from bytes_read when seeking is a bit off or if\n+     *  there are extra streams in the video file. */\n+    uint64_t bytes_decoded;\n+\n+    /** Total number of packets sent to NVDEC for decoding, see bytes_decoded */\n+    uint64_t packets_decoded;\n+\n+    /** Total number of frames actually used. This is usually less\n+     *  than packets_decoded because decoding must happen key frame to\n+     *  key frame and output sequences often span key frame sequences,\n+     *  requiring more frames to be decoded than are actually used in\n+     *  the output. */\n+    uint64_t frames_used;\n+};\n+\n+\n+class VideoLoader : public Loader<GPUBackend, SequenceWrapper> {\n+ public:\n+  explicit inline VideoLoader(const OpSpec& spec,\n+    const std::vector<std::string>& filenames)\n+    : Loader<GPUBackend, SequenceWrapper>(spec),\n+      count_(spec.GetArgument<int>(\"count\")),\n+      output_height_(spec.GetArgument<int>(\"height\")),\n+      output_width_(spec.GetArgument<int>(\"width\")),\n+      height_(0),\n+      width_(0),\n+      filenames_(filenames),\n+      // TODO(spanev) handle device_id != 0\n+      device_id_(0),\n+      codec_id_(0),\n+      done_(false) {\n+  }\n+\n+  void init() {\n+\n+    /* Required to use libavformat: Initialize libavformat and register all\n+     * the muxers, demuxers and protocols.\n+     */\n+    av_register_all();\n+\n+    // TODO(spanev) Implem several files handling\n+    total_frame_count_ = get_or_open_file(filenames_[0]).frame_count_;\n+\n+    // TODO(spanev) to change after deciding what we want\n+    int seq_per_epoch = total_frame_count_ / count_;\n+    frame_starts_.resize(seq_per_epoch);\n+    for (int i = 0; i < seq_per_epoch; ++i) {\n+      frame_starts_[i] = i * count_;\n+    }\n+    // TODO(spanev) change random engine\n+    auto rng = std::default_random_engine {};\n+    std::shuffle(std::begin(frame_starts_), std::end(frame_starts_), rng);\n+    current_frame_idx_ = 0;\n+\n+    thread_file_reader_ = std::thread{&VideoLoader::read_file, this};\n+  }\n+\n+  ~VideoLoader() noexcept {\n+    done_ = true;\n+    send_queue_.cancel_pops();\n+    if (vid_decoder_) {\n+      vid_decoder_->finish();\n+    }\n+    if (thread_file_reader_.joinable()) {\n+      try {\n+        thread_file_reader_.join();\n+      } catch (const std::system_error& e) {\n+        DALI_FAIL(\"System error joining thread: \"\n+                   + e.what());\n+      }\n+    }\n+  }\n+\n+  void PrepareEmpty(SequenceWrapper *tensor) override;\n+  void ReadSample(SequenceWrapper *tensor) override;\n+  Index Size() override;\n+\n+  OpenFile& get_or_open_file(std::string filename);\n+  void seek(OpenFile& file, int frame);\n+  void read_file();\n+  void push_sequence_to_read(std::string filename, int frame, int count);\n+  void receive_frames(SequenceWrapper& sequence);\n+\n+  // Params\n+  int count_;\n+  int output_height_;\n+  int output_width_;\n+  int height_;\n+  int width_;\n+  std::vector<std::string> filenames_;\n+\n+  int device_id_;\n+  int codec_id_;\n+  VideoLoaderStats stats_;\n+\n+  std::unordered_map<std::string, OpenFile> open_files_;\n+  std::unique_ptr<NvDecoder> vid_decoder_;\n+\n+  ThreadSafeQueue<FrameReq> send_queue_;\n+\n+  std::thread thread_file_reader_;\n+\n+  int total_frame_count_;\n+  std::vector<int> frame_starts_;\n+  unsigned current_frame_idx_;\n+\n+  bool done_;","path":"dali/pipeline/operators/reader/loader/video_loader.h","position":214,"original_position":214,"commit_id":"740bef6d89d55326e5f1c5ee0b8649026188a6de","original_commit_id":"740bef6d89d55326e5f1c5ee0b8649026188a6de","user":{"login":"JanuszL","id":39967756,"node_id":"MDQ6VXNlcjM5OTY3NzU2","avatar_url":"https://avatars1.githubusercontent.com/u/39967756?v=4","gravatar_id":"","url":"https://api.github.com/users/JanuszL","html_url":"https://github.com/JanuszL","followers_url":"https://api.github.com/users/JanuszL/followers","following_url":"https://api.github.com/users/JanuszL/following{/other_user}","gists_url":"https://api.github.com/users/JanuszL/gists{/gist_id}","starred_url":"https://api.github.com/users/JanuszL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JanuszL/subscriptions","organizations_url":"https://api.github.com/users/JanuszL/orgs","repos_url":"https://api.github.com/users/JanuszL/repos","events_url":"https://api.github.com/users/JanuszL/events{/privacy}","received_events_url":"https://api.github.com/users/JanuszL/received_events","type":"User","site_admin":false},"body":"Shouldn't that be a volatile variable?","created_at":"2018-11-28T09:08:17Z","updated_at":"2018-11-28T09:08:18Z","html_url":"https://github.com/NVIDIA/DALI/pull/316#discussion_r236993556","pull_request_url":"https://api.github.com/repos/NVIDIA/DALI/pulls/316","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/NVIDIA/DALI/pulls/comments/236993556"},"html":{"href":"https://github.com/NVIDIA/DALI/pull/316#discussion_r236993556"},"pull_request":{"href":"https://api.github.com/repos/NVIDIA/DALI/pulls/316"}}},"pull_request":{"url":"https://api.github.com/repos/NVIDIA/DALI/pulls/316","id":232776353,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMyNzc2MzUz","html_url":"https://github.com/NVIDIA/DALI/pull/316","diff_url":"https://github.com/NVIDIA/DALI/pull/316.diff","patch_url":"https://github.com/NVIDIA/DALI/pull/316.patch","issue_url":"https://api.github.com/repos/NVIDIA/DALI/issues/316","number":316,"state":"open","locked":false,"title":"[WIP] VideoReader operator","user":{"login":"Kh4L","id":3193578,"node_id":"MDQ6VXNlcjMxOTM1Nzg=","avatar_url":"https://avatars2.githubusercontent.com/u/3193578?v=4","gravatar_id":"","url":"https://api.github.com/users/Kh4L","html_url":"https://github.com/Kh4L","followers_url":"https://api.github.com/users/Kh4L/followers","following_url":"https://api.github.com/users/Kh4L/following{/other_user}","gists_url":"https://api.github.com/users/Kh4L/gists{/gist_id}","starred_url":"https://api.github.com/users/Kh4L/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kh4L/subscriptions","organizations_url":"https://api.github.com/users/Kh4L/orgs","repos_url":"https://api.github.com/users/Kh4L/repos","events_url":"https://api.github.com/users/Kh4L/events{/privacy}","received_events_url":"https://api.github.com/users/Kh4L/received_events","type":"User","site_admin":false},"body":"**VideoReader** operator loads and decodes H.264 and HEVC video codecs from any container format supported by FFmpeg and outputs sequences as a GPU TensorList.\r\n\r\nThe output is a batch, a TensorList, of **SHWC** Tensors, with **S** being defined by the `count` op argument.  \r\n\r\n:warning: This is a work-in-progress. :warning:\r\n\r\n**Initial PR**\r\n- Add new operators `VideoReader` and `VideoLoader`\r\n- Add a plethora of new classes in `dali/pipeline/operators/reader/nvdecoder`, which are parts of the VideoReader, with courtesy of [NVVL](https://github.com/NVIDIA/nvvl)\r\n- Add draft of an example in examples/video (cf. tasklist)\r\n- Now linking with some CUDA driver API for nvcuvid, cuda and nvidia-ml (required by the NVDECODE API)\r\n- Now linking with **FFmpeg** \r\n- Add a `ReaderOp::Run` template specialization to support `GPUBackend` (`TensorList` as an output) - hacky and temporary (cf. the tasklist below)\r\n- Change `CUDA_CALL` to support of `CUresult` (cuda driver API error code enum) in `error_handling.h`\r\n\r\n**TODOs**\r\n- [ ] Define how we want to link against libcuda, libnvidia-ml and libnvcuvid, dynloading?\r\n- [ ] Support multiple container files\r\n- [ ] Redesign the ReaderOp interface\r\n- [ ] Define op parameters\r\n- [ ] Add unit tests\r\n- [ ] Add a full example","created_at":"2018-11-21T19:29:15Z","updated_at":"2018-11-28T09:08:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6e3cb9c7c53bdb4760b8acee82d13cc106a37b23","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/NVIDIA/DALI/pulls/316/commits","review_comments_url":"https://api.github.com/repos/NVIDIA/DALI/pulls/316/comments","review_comment_url":"https://api.github.com/repos/NVIDIA/DALI/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NVIDIA/DALI/issues/316/comments","statuses_url":"https://api.github.com/repos/NVIDIA/DALI/statuses/740bef6d89d55326e5f1c5ee0b8649026188a6de","head":{"label":"Kh4L:video_loader_op","ref":"video_loader_op","sha":"740bef6d89d55326e5f1c5ee0b8649026188a6de","user":{"login":"Kh4L","id":3193578,"node_id":"MDQ6VXNlcjMxOTM1Nzg=","avatar_url":"https://avatars2.githubusercontent.com/u/3193578?v=4","gravatar_id":"","url":"https://api.github.com/users/Kh4L","html_url":"https://github.com/Kh4L","followers_url":"https://api.github.com/users/Kh4L/followers","following_url":"https://api.github.com/users/Kh4L/following{/other_user}","gists_url":"https://api.github.com/users/Kh4L/gists{/gist_id}","starred_url":"https://api.github.com/users/Kh4L/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kh4L/subscriptions","organizations_url":"https://api.github.com/users/Kh4L/orgs","repos_url":"https://api.github.com/users/Kh4L/repos","events_url":"https://api.github.com/users/Kh4L/events{/privacy}","received_events_url":"https://api.github.com/users/Kh4L/received_events","type":"User","site_admin":false},"repo":{"id":139641410,"node_id":"MDEwOlJlcG9zaXRvcnkxMzk2NDE0MTA=","name":"DALI","full_name":"Kh4L/DALI","private":false,"owner":{"login":"Kh4L","id":3193578,"node_id":"MDQ6VXNlcjMxOTM1Nzg=","avatar_url":"https://avatars2.githubusercontent.com/u/3193578?v=4","gravatar_id":"","url":"https://api.github.com/users/Kh4L","html_url":"https://github.com/Kh4L","followers_url":"https://api.github.com/users/Kh4L/followers","following_url":"https://api.github.com/users/Kh4L/following{/other_user}","gists_url":"https://api.github.com/users/Kh4L/gists{/gist_id}","starred_url":"https://api.github.com/users/Kh4L/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kh4L/subscriptions","organizations_url":"https://api.github.com/users/Kh4L/orgs","repos_url":"https://api.github.com/users/Kh4L/repos","events_url":"https://api.github.com/users/Kh4L/events{/privacy}","received_events_url":"https://api.github.com/users/Kh4L/received_events","type":"User","site_admin":false},"html_url":"https://github.com/Kh4L/DALI","description":"A library containing both highly optimized building blocks and an execution engine for data pre-processing in deep learning applications","fork":true,"url":"https://api.github.com/repos/Kh4L/DALI","forks_url":"https://api.github.com/repos/Kh4L/DALI/forks","keys_url":"https://api.github.com/repos/Kh4L/DALI/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Kh4L/DALI/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Kh4L/DALI/teams","hooks_url":"https://api.github.com/repos/Kh4L/DALI/hooks","issue_events_url":"https://api.github.com/repos/Kh4L/DALI/issues/events{/number}","events_url":"https://api.github.com/repos/Kh4L/DALI/events","assignees_url":"https://api.github.com/repos/Kh4L/DALI/assignees{/user}","branches_url":"https://api.github.com/repos/Kh4L/DALI/branches{/branch}","tags_url":"https://api.github.com/repos/Kh4L/DALI/tags","blobs_url":"https://api.github.com/repos/Kh4L/DALI/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Kh4L/DALI/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Kh4L/DALI/git/refs{/sha}","trees_url":"https://api.github.com/repos/Kh4L/DALI/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Kh4L/DALI/statuses/{sha}","languages_url":"https://api.github.com/repos/Kh4L/DALI/languages","stargazers_url":"https://api.github.com/repos/Kh4L/DALI/stargazers","contributors_url":"https://api.github.com/repos/Kh4L/DALI/contributors","subscribers_url":"https://api.github.com/repos/Kh4L/DALI/subscribers","subscription_url":"https://api.github.com/repos/Kh4L/DALI/subscription","commits_url":"https://api.github.com/repos/Kh4L/DALI/commits{/sha}","git_commits_url":"https://api.github.com/repos/Kh4L/DALI/git/commits{/sha}","comments_url":"https://api.github.com/repos/Kh4L/DALI/comments{/number}","issue_comment_url":"https://api.github.com/repos/Kh4L/DALI/issues/comments{/number}","contents_url":"https://api.github.com/repos/Kh4L/DALI/contents/{+path}","compare_url":"https://api.github.com/repos/Kh4L/DALI/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Kh4L/DALI/merges","archive_url":"https://api.github.com/repos/Kh4L/DALI/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Kh4L/DALI/downloads","issues_url":"https://api.github.com/repos/Kh4L/DALI/issues{/number}","pulls_url":"https://api.github.com/repos/Kh4L/DALI/pulls{/number}","milestones_url":"https://api.github.com/repos/Kh4L/DALI/milestones{/number}","notifications_url":"https://api.github.com/repos/Kh4L/DALI/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Kh4L/DALI/labels{/name}","releases_url":"https://api.github.com/repos/Kh4L/DALI/releases{/id}","deployments_url":"https://api.github.com/repos/Kh4L/DALI/deployments","created_at":"2018-07-03T22:05:17Z","updated_at":"2018-11-23T09:33:21Z","pushed_at":"2018-11-27T14:50:13Z","git_url":"git://github.com/Kh4L/DALI.git","ssh_url":"git@github.com:Kh4L/DALI.git","clone_url":"https://github.com/Kh4L/DALI.git","svn_url":"https://github.com/Kh4L/DALI","homepage":"https://docs.nvidia.com/deeplearning/sdk/dali-developer-guide/index.html","size":41603,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"NVIDIA:master","ref":"master","sha":"7e12ffdcff51141c9c730b0767234d5c4e18a607","user":{"login":"NVIDIA","id":1728152,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3MjgxNTI=","avatar_url":"https://avatars2.githubusercontent.com/u/1728152?v=4","gravatar_id":"","url":"https://api.github.com/users/NVIDIA","html_url":"https://github.com/NVIDIA","followers_url":"https://api.github.com/users/NVIDIA/followers","following_url":"https://api.github.com/users/NVIDIA/following{/other_user}","gists_url":"https://api.github.com/users/NVIDIA/gists{/gist_id}","starred_url":"https://api.github.com/users/NVIDIA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NVIDIA/subscriptions","organizations_url":"https://api.github.com/users/NVIDIA/orgs","repos_url":"https://api.github.com/users/NVIDIA/repos","events_url":"https://api.github.com/users/NVIDIA/events{/privacy}","received_events_url":"https://api.github.com/users/NVIDIA/received_events","type":"Organization","site_admin":false},"repo":{"id":135768037,"node_id":"MDEwOlJlcG9zaXRvcnkxMzU3NjgwMzc=","name":"DALI","full_name":"NVIDIA/DALI","private":false,"owner":{"login":"NVIDIA","id":1728152,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3MjgxNTI=","avatar_url":"https://avatars2.githubusercontent.com/u/1728152?v=4","gravatar_id":"","url":"https://api.github.com/users/NVIDIA","html_url":"https://github.com/NVIDIA","followers_url":"https://api.github.com/users/NVIDIA/followers","following_url":"https://api.github.com/users/NVIDIA/following{/other_user}","gists_url":"https://api.github.com/users/NVIDIA/gists{/gist_id}","starred_url":"https://api.github.com/users/NVIDIA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NVIDIA/subscriptions","organizations_url":"https://api.github.com/users/NVIDIA/orgs","repos_url":"https://api.github.com/users/NVIDIA/repos","events_url":"https://api.github.com/users/NVIDIA/events{/privacy}","received_events_url":"https://api.github.com/users/NVIDIA/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/NVIDIA/DALI","description":"A library containing both highly optimized building blocks and an execution engine for data pre-processing in deep learning applications","fork":false,"url":"https://api.github.com/repos/NVIDIA/DALI","forks_url":"https://api.github.com/repos/NVIDIA/DALI/forks","keys_url":"https://api.github.com/repos/NVIDIA/DALI/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NVIDIA/DALI/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NVIDIA/DALI/teams","hooks_url":"https://api.github.com/repos/NVIDIA/DALI/hooks","issue_events_url":"https://api.github.com/repos/NVIDIA/DALI/issues/events{/number}","events_url":"https://api.github.com/repos/NVIDIA/DALI/events","assignees_url":"https://api.github.com/repos/NVIDIA/DALI/assignees{/user}","branches_url":"https://api.github.com/repos/NVIDIA/DALI/branches{/branch}","tags_url":"https://api.github.com/repos/NVIDIA/DALI/tags","blobs_url":"https://api.github.com/repos/NVIDIA/DALI/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NVIDIA/DALI/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NVIDIA/DALI/git/refs{/sha}","trees_url":"https://api.github.com/repos/NVIDIA/DALI/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NVIDIA/DALI/statuses/{sha}","languages_url":"https://api.github.com/repos/NVIDIA/DALI/languages","stargazers_url":"https://api.github.com/repos/NVIDIA/DALI/stargazers","contributors_url":"https://api.github.com/repos/NVIDIA/DALI/contributors","subscribers_url":"https://api.github.com/repos/NVIDIA/DALI/subscribers","subscription_url":"https://api.github.com/repos/NVIDIA/DALI/subscription","commits_url":"https://api.github.com/repos/NVIDIA/DALI/commits{/sha}","git_commits_url":"https://api.github.com/repos/NVIDIA/DALI/git/commits{/sha}","comments_url":"https://api.github.com/repos/NVIDIA/DALI/comments{/number}","issue_comment_url":"https://api.github.com/repos/NVIDIA/DALI/issues/comments{/number}","contents_url":"https://api.github.com/repos/NVIDIA/DALI/contents/{+path}","compare_url":"https://api.github.com/repos/NVIDIA/DALI/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NVIDIA/DALI/merges","archive_url":"https://api.github.com/repos/NVIDIA/DALI/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NVIDIA/DALI/downloads","issues_url":"https://api.github.com/repos/NVIDIA/DALI/issues{/number}","pulls_url":"https://api.github.com/repos/NVIDIA/DALI/pulls{/number}","milestones_url":"https://api.github.com/repos/NVIDIA/DALI/milestones{/number}","notifications_url":"https://api.github.com/repos/NVIDIA/DALI/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NVIDIA/DALI/labels{/name}","releases_url":"https://api.github.com/repos/NVIDIA/DALI/releases{/id}","deployments_url":"https://api.github.com/repos/NVIDIA/DALI/deployments","created_at":"2018-06-01T22:18:01Z","updated_at":"2018-11-27T21:00:27Z","pushed_at":"2018-11-27T18:05:31Z","git_url":"git://github.com/NVIDIA/DALI.git","ssh_url":"git@github.com:NVIDIA/DALI.git","clone_url":"https://github.com/NVIDIA/DALI.git","svn_url":"https://github.com/NVIDIA/DALI","homepage":"https://docs.nvidia.com/deeplearning/sdk/dali-developer-guide/index.html","size":40753,"stargazers_count":826,"watchers_count":826,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":90,"mirror_url":null,"archived":false,"open_issues_count":43,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":90,"open_issues":43,"watchers":826,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/NVIDIA/DALI/pulls/316"},"html":{"href":"https://github.com/NVIDIA/DALI/pull/316"},"issue":{"href":"https://api.github.com/repos/NVIDIA/DALI/issues/316"},"comments":{"href":"https://api.github.com/repos/NVIDIA/DALI/issues/316/comments"},"review_comments":{"href":"https://api.github.com/repos/NVIDIA/DALI/pulls/316/comments"},"review_comment":{"href":"https://api.github.com/repos/NVIDIA/DALI/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NVIDIA/DALI/pulls/316/commits"},"statuses":{"href":"https://api.github.com/repos/NVIDIA/DALI/statuses/740bef6d89d55326e5f1c5ee0b8649026188a6de"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"JanuszL"}}