<br />

1. Ensure you have a working version of MediaPipe Framework. See
   [installation instructions](https://developers.google.com/edge/mediapipe/framework/getting_started/install).

2. To run the [`hello world`](https://github.com/google/mediapipe/tree/master/mediapipe/examples/desktop/hello_world/hello_world.cc) example:

       $ git clone https://github.com/google/mediapipe.git
       $ cd mediapipe

       $ export GLOG_logtostderr=1
       # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' as desktop GPU is not supported currently.
       $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
           mediapipe/examples/desktop/hello_world:hello_world

       # It should print 10 rows of Hello World!
       # Hello World!
       # Hello World!
       # Hello World!
       # Hello World!
       # Hello World!
       # Hello World!
       # Hello World!
       # Hello World!
       # Hello World!
       # Hello World!

3. The [`hello world`](https://github.com/google/mediapipe/tree/master/mediapipe/examples/desktop/hello_world/hello_world.cc) example uses a simple MediaPipe graph in the
   `PrintHelloWorld()` function, defined in a [`CalculatorGraphConfig`](https://github.com/google/mediapipe/tree/master/mediapipe/framework/calculator.proto) proto.

       absl::Status PrintHelloWorld() {
         // Configures a simple graph, which concatenates 2 PassThroughCalculators.
         CalculatorGraphConfig config = ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
           input_stream: "in"
           output_stream: "out"
           node {
             calculator: "PassThroughCalculator"
             input_stream: "in"
             output_stream: "out1"
           }
           node {
             calculator: "PassThroughCalculator"
             input_stream: "out1"
             output_stream: "out"
           }
         )");

   You can visualize this graph using
   [MediaPipe Visualizer](https://viz.mediapipe.dev) by pasting the following
   CalculatorGraphConfig content into the visualizer. See the
   [MediaPipe Visualizer guide](https://developers.google.com/edge/mediapipe/framework/tools/visualizer) for usage instructions.

           input_stream: "in"
           output_stream: "out"
           node {
             calculator: "PassThroughCalculator"
             input_stream: "in"
             output_stream: "out1"
           }
           node {
             calculator: "PassThroughCalculator"
             input_stream: "out1"
             output_stream: "out"
           }

   This graph consists of 1 graph input stream (`in`) and 1 graph output stream
   (`out`), and 2 [`PassThroughCalculator`](https://github.com/google/mediapipe/tree/master/mediapipe/calculators/core/pass_through_calculator.cc)s connected serially.

   ![hello_world graph](https://developers.google.com/edge/mediapipe/framework/images/hello_world.png)
4. Before running the graph, an `OutputStreamPoller` object is connected to the
   output stream in order to later retrieve the graph output, and a graph run
   is started with [`StartRun`](https://github.com/google/mediapipe/tree/master/mediapipe/framework/calculator_graph.h).

       CalculatorGraph graph;
       MP_RETURN_IF_ERROR(graph.Initialize(config));
       MP_ASSIGN_OR_RETURN(OutputStreamPoller poller,
                           graph.AddOutputStreamPoller("out"));
       MP_RETURN_IF_ERROR(graph.StartRun({}));

5. The example then creates 10 packets (each packet contains a string "Hello
   World!" with Timestamp values ranging from 0, 1, ... 9) using the
   [`MakePacket`](https://github.com/google/mediapipe/tree/master/mediapipe/framework/packet.h) function, adds each packet into the graph through the `in`
   input stream, and finally closes the input stream to finish the graph run.

       for (int i = 0; i < 10; ++i) {
         MP_RETURN_IF_ERROR(graph.AddPacketToInputStream("in",
                            MakePacket<std::string>("Hello World!").At(Timestamp(i))));
       }
       MP_RETURN_IF_ERROR(graph.CloseInputStream("in"));

6. Through the `OutputStreamPoller` object the example then retrieves all 10
   packets from the output stream, gets the string content out of each packet
   and prints it to the output log.

       mediapipe::Packet packet;
       while (poller.Next(&packet)) {
         LOG(INFO) << packet.Get<string>();
       }