// media/mojo/mojom/demuxer_stream.mojom-lite-for-compile.js is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';

goog.require('mojo.internal');
goog.require('mojo.internal.interfaceSupport');

goog.require('media.mojom.AudioDecoderConfig');
goog.require('media.mojom.DecoderBuffer');
goog.require('media.mojom.VideoDecoderConfig');






goog.provide('media.mojom.DemuxerStream');
goog.provide('media.mojom.DemuxerStreamReceiver');
goog.provide('media.mojom.DemuxerStreamCallbackRouter');
goog.provide('media.mojom.DemuxerStreamInterface');
goog.provide('media.mojom.DemuxerStreamRemote');
goog.provide('media.mojom.DemuxerStreamPendingReceiver');


/**
 * @implements {mojo.internal.interfaceSupport.PendingReceiver}
 * @export
 */
media.mojom.DemuxerStreamPendingReceiver = class {
  /**
   * @param {!MojoHandle|!mojo.internal.interfaceSupport.Endpoint} handle
   */
  constructor(handle) {
    /** @public {!mojo.internal.interfaceSupport.Endpoint} */
    this.handle = mojo.internal.interfaceSupport.getEndpointForReceiver(handle);
  }

  /** @param {string=} scope */
  bindInBrowser(scope = 'context') {
    mojo.internal.interfaceSupport.bind(
        this.handle,
        media.mojom.DemuxerStream.$interfaceName,
        scope);
  }
};

/** @interface */
media.mojom.DemuxerStreamInterface = class {
  
  /**
   * @return {!Promise<{
        type: !media.mojom.DemuxerStream_Type,
        pipe: !MojoHandle,
        audioConfig: ?media.mojom.AudioDecoderConfig,
        videoConfig: ?media.mojom.VideoDecoderConfig,
   *  }>}
   */

  initialize() {}
  
  /**
   * @return {!Promise<{
        status: !media.mojom.DemuxerStream_Status,
        buffer: ?media.mojom.DecoderBuffer,
        audioConfig: ?media.mojom.AudioDecoderConfig,
        videoConfig: ?media.mojom.VideoDecoderConfig,
   *  }>}
   */

  read() {}
  
  /**
   */

  enableBitstreamConverter() {}
};

/**
 * @export
 * @implements { media.mojom.DemuxerStreamInterface }
 */
media.mojom.DemuxerStreamRemote = class {
  /** @param {MojoHandle|mojo.internal.interfaceSupport.Endpoint=} handle */
  constructor(handle = undefined) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!media.mojom.DemuxerStreamPendingReceiver>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          media.mojom.DemuxerStreamPendingReceiver,
          handle);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper<!media.mojom.DemuxerStreamPendingReceiver>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper(this.proxy);

    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.proxy.getConnectionErrorEventRouter();
  }

  
  /**
   * @return {!Promise<{
        type: !media.mojom.DemuxerStream_Type,
        pipe: !MojoHandle,
        audioConfig: ?media.mojom.AudioDecoderConfig,
        videoConfig: ?media.mojom.VideoDecoderConfig,
   *  }>}
   */

  initialize() {
    return this.proxy.sendMessage(
        1631763576,
        media.mojom.DemuxerStream_Initialize_ParamsSpec.$,
        media.mojom.DemuxerStream_Initialize_ResponseParamsSpec.$,
        [
        ]);
  }

  
  /**
   * @return {!Promise<{
        status: !media.mojom.DemuxerStream_Status,
        buffer: ?media.mojom.DecoderBuffer,
        audioConfig: ?media.mojom.AudioDecoderConfig,
        videoConfig: ?media.mojom.VideoDecoderConfig,
   *  }>}
   */

  read() {
    return this.proxy.sendMessage(
        456032577,
        media.mojom.DemuxerStream_Read_ParamsSpec.$,
        media.mojom.DemuxerStream_Read_ResponseParamsSpec.$,
        [
        ]);
  }

  
  /**
   */

  enableBitstreamConverter() {
    this.proxy.sendMessage(
        81841308,
        media.mojom.DemuxerStream_EnableBitstreamConverter_ParamsSpec.$,
        null,
        [
        ]);
  }
};

/**
 * An object which receives request messages for the DemuxerStream
 * mojom interface. Must be constructed over an object which implements that
 * interface.
 *
 * @export
 */
media.mojom.DemuxerStreamReceiver = class {
  /**
   * @param {!media.mojom.DemuxerStreamInterface } impl
   */
  constructor(impl) {
    /** @private {!mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal<!media.mojom.DemuxerStreamRemote>} */
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
        media.mojom.DemuxerStreamRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!media.mojom.DemuxerStreamRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);


    this.helper_internal_.registerHandler(
        1631763576,
        media.mojom.DemuxerStream_Initialize_ParamsSpec.$,
        media.mojom.DemuxerStream_Initialize_ResponseParamsSpec.$,
        impl.initialize.bind(impl));
    this.helper_internal_.registerHandler(
        456032577,
        media.mojom.DemuxerStream_Read_ParamsSpec.$,
        media.mojom.DemuxerStream_Read_ResponseParamsSpec.$,
        impl.read.bind(impl));
    this.helper_internal_.registerHandler(
        81841308,
        media.mojom.DemuxerStream_EnableBitstreamConverter_ParamsSpec.$,
        null,
        impl.enableBitstreamConverter.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }
};

/**
 *  @export
 */
media.mojom.DemuxerStream = class {
  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "media.mojom.DemuxerStream";
  }

  /**
   * Returns a remote for this interface which sends messages to the browser.
   * The browser must have an interface request binder registered for this
   * interface and accessible to the calling document's frame.
   *
   * @return {!media.mojom.DemuxerStreamRemote}
   * @export
   */
  static getRemote() {
    let remote = new media.mojom.DemuxerStreamRemote;
    remote.$.bindNewPipeAndPassReceiver().bindInBrowser();
    return remote;
  }
};

goog.provide('media.mojom.DemuxerStream_Type');
goog.provide('media.mojom.DemuxerStream.TypeSpec');
/**
 * @const { {$: !mojo.internal.MojomType} }
 * @export
 */
media.mojom.DemuxerStream.TypeSpec = { $: mojo.internal.Enum() };

/**
 * @enum {number}
 * @export
 */
media.mojom.DemuxerStream_Type = {
  
};
goog.provide('media.mojom.DemuxerStream_Status');
goog.provide('media.mojom.DemuxerStream.StatusSpec');
/**
 * @const { {$: !mojo.internal.MojomType} }
 * @export
 */
media.mojom.DemuxerStream.StatusSpec = { $: mojo.internal.Enum() };

/**
 * @enum {number}
 * @export
 */
media.mojom.DemuxerStream_Status = {
  
};

/**
 * An object which receives request messages for the DemuxerStream
 * mojom interface and dispatches them as callbacks. One callback receiver exists
 * on this object for each message defined in the mojom interface, and each
 * receiver can have any number of listeners added to it.
 *
 * @export
 */
media.mojom.DemuxerStreamCallbackRouter = class {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      media.mojom.DemuxerStreamRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!media.mojom.DemuxerStreamRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);

    this.router_ = new mojo.internal.interfaceSupport.CallbackRouter;

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.initialize =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1631763576,
        media.mojom.DemuxerStream_Initialize_ParamsSpec.$,
        media.mojom.DemuxerStream_Initialize_ResponseParamsSpec.$,
        this.initialize.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.read =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        456032577,
        media.mojom.DemuxerStream_Read_ParamsSpec.$,
        media.mojom.DemuxerStream_Read_ResponseParamsSpec.$,
        this.read.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.enableBitstreamConverter =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        81841308,
        media.mojom.DemuxerStream_EnableBitstreamConverter_ParamsSpec.$,
        null,
        this.enableBitstreamConverter.createReceiverHandler(false /* expectsResponse */));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * @param {number} id An ID returned by a prior call to addListener.
   * @return {boolean} True iff the identified listener was found and removed.
   * @export
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
};


goog.provide('media.mojom.DemuxerStream_Initialize_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
media.mojom.DemuxerStream_Initialize_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('media.mojom.DemuxerStream_Initialize_ResponseParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
media.mojom.DemuxerStream_Initialize_ResponseParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('media.mojom.DemuxerStream_Read_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
media.mojom.DemuxerStream_Read_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('media.mojom.DemuxerStream_Read_ResponseParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
media.mojom.DemuxerStream_Read_ResponseParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('media.mojom.DemuxerStream_EnableBitstreamConverter_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
media.mojom.DemuxerStream_EnableBitstreamConverter_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };




mojo.internal.Struct(
    media.mojom.DemuxerStream_Initialize_ParamsSpec.$,
    'DemuxerStream_Initialize_Params',
    [
    ],
    [[0, 8],]);



goog.provide('media.mojom.DemuxerStream_Initialize_Params');

/** @record */
media.mojom.DemuxerStream_Initialize_Params = class {
  constructor() {
  }
};




mojo.internal.Struct(
    media.mojom.DemuxerStream_Initialize_ResponseParamsSpec.$,
    'DemuxerStream_Initialize_ResponseParams',
    [
      mojo.internal.StructField(
        'type', 0,
        0,
        media.mojom.DemuxerStream.TypeSpec.$,
        0,
        false /* nullable */),
      mojo.internal.StructField(
        'pipe', 4,
        0,
        mojo.internal.Handle,
        null,
        false /* nullable */),
      mojo.internal.StructField(
        'audioConfig', 8,
        0,
        media.mojom.AudioDecoderConfigSpec.$,
        null,
        true /* nullable */),
      mojo.internal.StructField(
        'videoConfig', 16,
        0,
        media.mojom.VideoDecoderConfigSpec.$,
        null,
        true /* nullable */),
    ],
    [[0, 32],]);



goog.provide('media.mojom.DemuxerStream_Initialize_ResponseParams');

/** @record */
media.mojom.DemuxerStream_Initialize_ResponseParams = class {
  constructor() {
    /** @export { !media.mojom.DemuxerStream_Type } */
    this.type;
    /** @export { !MojoHandle } */
    this.pipe;
    /** @export { (media.mojom.AudioDecoderConfig|undefined) } */
    this.audioConfig;
    /** @export { (media.mojom.VideoDecoderConfig|undefined) } */
    this.videoConfig;
  }
};




mojo.internal.Struct(
    media.mojom.DemuxerStream_Read_ParamsSpec.$,
    'DemuxerStream_Read_Params',
    [
    ],
    [[0, 8],]);



goog.provide('media.mojom.DemuxerStream_Read_Params');

/** @record */
media.mojom.DemuxerStream_Read_Params = class {
  constructor() {
  }
};




mojo.internal.Struct(
    media.mojom.DemuxerStream_Read_ResponseParamsSpec.$,
    'DemuxerStream_Read_ResponseParams',
    [
      mojo.internal.StructField(
        'status', 0,
        0,
        media.mojom.DemuxerStream.StatusSpec.$,
        0,
        false /* nullable */),
      mojo.internal.StructField(
        'buffer', 8,
        0,
        media.mojom.DecoderBufferSpec.$,
        null,
        true /* nullable */),
      mojo.internal.StructField(
        'audioConfig', 16,
        0,
        media.mojom.AudioDecoderConfigSpec.$,
        null,
        true /* nullable */),
      mojo.internal.StructField(
        'videoConfig', 24,
        0,
        media.mojom.VideoDecoderConfigSpec.$,
        null,
        true /* nullable */),
    ],
    [[0, 40],]);



goog.provide('media.mojom.DemuxerStream_Read_ResponseParams');

/** @record */
media.mojom.DemuxerStream_Read_ResponseParams = class {
  constructor() {
    /** @export { !media.mojom.DemuxerStream_Status } */
    this.status;
    /** @export { (media.mojom.DecoderBuffer|undefined) } */
    this.buffer;
    /** @export { (media.mojom.AudioDecoderConfig|undefined) } */
    this.audioConfig;
    /** @export { (media.mojom.VideoDecoderConfig|undefined) } */
    this.videoConfig;
  }
};




mojo.internal.Struct(
    media.mojom.DemuxerStream_EnableBitstreamConverter_ParamsSpec.$,
    'DemuxerStream_EnableBitstreamConverter_Params',
    [
    ],
    [[0, 8],]);



goog.provide('media.mojom.DemuxerStream_EnableBitstreamConverter_Params');

/** @record */
media.mojom.DemuxerStream_EnableBitstreamConverter_Params = class {
  constructor() {
  }
};


