webrtcvideoencoderfactory.h revision 52cd828e1731266272e671020c353f5f89992a83
1be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik/*
2be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * libjingle
3be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * Copyright 2013 Google Inc.
4be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *
5be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * Redistribution and use in source and binary forms, with or without
6be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * modification, are permitted provided that the following conditions are met:
7be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *
8be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *  1. Redistributions of source code must retain the above copyright notice,
9be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *     this list of conditions and the following disclaimer.
10be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *  2. Redistributions in binary form must reproduce the above copyright notice,
11be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *     this list of conditions and the following disclaimer in the documentation
12a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik *     and/or other materials provided with the distribution.
13be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *  3. The name of the author may not be used to endorse or promote products
14be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *     derived from this software without specific prior written permission.
15be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik *
16a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik */
27be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik
28be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik#ifndef TALK_MEDIA_WEBRTC_WEBRTCVIDEOENCODERFACTORY_H_
29be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik#define TALK_MEDIA_WEBRTC_WEBRTCVIDEOENCODERFACTORY_H_
30eeb03f366d148f92337cfd7577087ade44ab9285John Reck
31eeb03f366d148f92337cfd7577087ade44ab9285John Reck#include "talk/media/base/codec.h"
32be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik#include "webrtc/base/refcount.h"
335ad62731e62b9eb8d13f6e66dd1b57deaebdee11Chris Craik#include "webrtc/common_types.h"
345ad62731e62b9eb8d13f6e66dd1b57deaebdee11Chris Craik
35a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craiknamespace webrtc {
36a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craikclass VideoEncoder;
37be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik}
38a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik
39be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craiknamespace cricket {
40576fd2a645575980f16b6731dab0f4f150100657Chris Craik
41be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craikclass WebRtcVideoEncoderFactory {
42d0ebf633155e2d637d289933ef7dbc5d86f73881Chris Craik public:
43d0ebf633155e2d637d289933ef7dbc5d86f73881Chris Craik  struct VideoCodec {
44be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik    webrtc::VideoCodecType type;
45be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik    std::string name;
46be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik    int max_width;
47be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik    int max_height;
48be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik    int max_fps;
49be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik
50be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik    VideoCodec(webrtc::VideoCodecType t, const std::string& nm, int w, int h,
51be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik               int fr)
52be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik        : type(t), name(nm), max_width(w), max_height(h), max_fps(fr) {
53be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik    }
54be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  };
55be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik
56be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  virtual ~WebRtcVideoEncoderFactory() {}
57be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik
58be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  // Caller takes the ownership of the returned object and it should be released
59be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  // by calling DestroyVideoEncoder().
60be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  virtual webrtc::VideoEncoder* CreateVideoEncoder(
61be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik      webrtc::VideoCodecType type) = 0;
62be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik
63be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  // Returns a list of supported codecs in order of preference.
64be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  virtual const std::vector<VideoCodec>& codecs() const = 0;
65be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik
66be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  // Returns true if encoders created by this factory of the given codec type
67be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  // will use internal camera sources, meaning that they don't require/expect
68be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  // frames to be delivered via webrtc::VideoEncoder::Encode. This flag is used
69be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  // as the internal_source parameter to
70be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  // webrtc::ViEExternalCodec::RegisterExternalSendCodec.
71be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  virtual bool EncoderTypeHasInternalSource(webrtc::VideoCodecType type) const {
72be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik    return false;
73be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  }
74be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik
75be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik  virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) = 0;
76be1f909aea58dd8b153538c9fa19cb0bf50bdb17Chris Craik};
77a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik
78a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik}  // namespace cricket
79a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik
80a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik#endif  // TALK_MEDIA_WEBRTC_WEBRTCVIDEOENCODERFACTORY_H_
81a23c9e9f6fc22fe5611def685e1984062b13b560Chris Craik